2011-12-21 14 views
7

में लंबाई एन के साथ शब्द से 2^एन परिवर्तित शब्द कैसे बनाया जाए, मुझे नीचे उदाहरण में सभी परिवर्तित शब्द बनाने के लिए एसक्यूएल सर्वर में एक फ़ंक्शन चाहिए; लंबाई 0 के साथ इनपुट शब्द के लिए 2^एन परिवर्तित शब्द बनाना चाहिए; उदाहरण के लिए, समारोह के इनपुट है अगरएसक्यूएल सर्वर

"I" 

फ़ंक्शन के परिणाम होना चाहिए

I 
- 

समारोह के इनपुट

"am" 

फ़ंक्शन के परिणाम है

am 
-m 
a- 
-- 
होना चाहिए

समारोह के इनपुट समारोह के उत्पादन में होना चाहिए

sql 
-ql 
s-l 
sq- 
--l 
s-- 
-q- 
--- 

उत्तर

9

आप एक संख्या तालिका (master..spt_values) और stuff एक पाश में साथ ऐसा कर सकते

"sql" 

है।

declare @Word varchar(10) = 'sql' 

declare @T table 
(
    Word varchar(10) 
) 

insert into @T values (@Word) 

while not exists(select * 
       from @T 
       where Word = replicate('-', len(@Word))) 
begin    
    insert into @T(Word) 
    select distinct stuff(T.Word, N.number, 1, '-') 
    from @T as T 
    cross join 
     master..spt_values as N 
    where N.type = 'P' and 
     N.number between 1 and len(@Word) and 
     stuff(T.Word, N.number, 1, '-') not in (select Word from @T) 
end   

select * 
from @T 

http://data.stackexchange.com/stackoverflow/q/122334/

या आप एक reqursive उपयोग कर सकते हैं CTE

declare @Word varchar(10) = 'sql' 

;with C as 
(
    select @Word as Word, 
     0 as Iteration 
    union all 
    select cast(stuff(Word, N.number, 1, '-') as varchar(10)), 
     Iteration + 1 
    from C 
    cross join 
     master..spt_values as N 
    where N.type = 'P' and 
     N.number between 1 and len(@Word) and 
     Iteration < len(@Word) 
) 
select distinct Word 
from C 

http://data.stackexchange.com/stackoverflow/q/122337/

अद्यतन

पुनरावर्ती CTE संस्करण वास्तव में poi के रूप में धीमी है एक टिप्पणी में ओपी द्वारा nted बाहर nted। 7 अक्षरों वाला एक शब्द का उपयोग सीटीई से 960800 पंक्तियां लौटा दी गई हैं।

+0

+1 पर काम कर देखें और आप आदेश है कि ओपी –

+0

@ConradFrix चाहता है में उत्पादन मिला - क्रम जानबूझकर :) नहीं था। –

+2

दूसरा उत्तर अच्छा है लेकिन "उदाहरण" इनपुट स्ट्रिंग के लिए समय 28 सेकंड है, पहला जवाब बहुत अच्छा है और "उदाहरण" इनपुट स्ट्रिंग के लिए समय 0 सेकंड – jozi

6

यह रिकर्सिव CTE

declare @input varchar(25) 

set @input = 'SQL' 
;WITH cte 
    AS (SELECT Stuff(@input, v.NUMBER, 1, '-') OUTPUT, 
       0        LEVEL 
     FROM MASTER..spt_values v 
     WHERE TYPE = 'P' 
       AND NUMBER BETWEEN 1 AND Len(@input) 
     UNION ALL 
     SELECT Stuff(cte.OUTPUT, v.NUMBER, 1, '-') OUTPUT, 
       cte.LEVEL + 1      AS LEVEL 
     FROM MASTER..spt_values v, 
       cte 
     WHERE TYPE = 'P' 
       AND cte.LEVEL + 1 < Len(@input) 
       AND NUMBER BETWEEN 1 AND Len(@input)) SELECT DISTINCT OUTPUT 
FROM cte 
UNION 
SELECT @INPUT 
ORDER BY OUTPUT 

निम्नलिखित उत्पादन

---  
--l  
-q-  
-ql  
s--  
s-l  
sq-  
sql 

मैं तुम्हें करने के लिए इसे छोड़ एक समारोह में लाना पैदा करता है।

यह इस data.se query

+0

मुझे बस इसे +1 करना होगा :) –

+0

यह बहुत अच्छा है लेकिन "उदाहरण" इनपुट स्ट्रिंग के लिए 35 सेकंड चल रहा है – jozi

संबंधित मुद्दे