2011-12-21 28 views
7

我需要在sql server中創建一個函數來構建下面例子中的所有修改過的單詞; 對於長度爲n的輸入字必須建立2^n改變字; 例如,如果該函數的輸入是如何在sql server中構建2^n長度爲n的單詞修改字

"I" 

的函數的輸出應是

I 
- 

該函數的輸入是

"am" 

的函數的輸出應該是

am 
-m 
a- 
-- 

函數的輸入是

"sql" 

函數的輸出應該

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

回答

9

您可以在一個循環中的數字表(master..spt_values)和stuff做到這一點。

​​

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很慢由OP發表評論。使用7個字母的單詞,從CTE返回960800行。

+0

+1工作,你得到的是,OP希望 – 2011-12-21 06:56:04

+0

@ConradFrix順序輸出 - 訂單不是故意的:)。 – 2011-12-21 07:01:42

+2

第二個答案是好的,但「示例」輸入字符串的時間爲28秒,第一個答案非常好,「示例」輸入字符串的時間爲0秒 – jozi 2011-12-21 09:07:49

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這個以及:) – 2011-12-21 07:05:45

+0

它非常好,但對於「示例」輸入字符串35秒運行時間 – jozi 2011-12-21 09:03:37

相關問題