2011-12-15 33 views
8

我已經遍尋搜索,無法在任何地方找到此實現。T-SQL將字拆分爲字符

比方說,我有一句話:QWERTY

我想獲得該表:

Q 
W 
E 
R 
T 
Y 

或爲QWERTY AnotherWord我想獲得

Q 
W 
E 
R 
T 
Y 
[space character here] 
A 
n 
o 
t 
h 
e 
r 
W 
o 
r 
d 
+0

這是http://stackoverflow.com/questions/697519/split-function-equivalent-in-tsql –

+1

的副本抱歉,谷歌和計算器搜索沒有返回任何結果的Userful。另一方面,我發現這裏給出的答案更好更快,它更符合我對解決方案的需求。另外,我認爲這是更直接的。 –

回答

19

像這樣做:

select substring(a.b, v.number+1, 1) 
from (select 'QWERTY AnotherWord' b) a 
join master..spt_values v on v.number < len(a.b) 
where v.type = 'P' 
+0

hi @ t-clausen.dk,該解決方案不適用於azure sql數據庫。你有其他選擇嗎? –

3

在這裏,你就會明白:

create table #words (
    character varchar(1) 
) 

declare @test varchar(10) 
select @test = 'QWERTY' 

declare @count int, @total int 
select @total = len(@test), @count = 0 

while @count <= @total 
begin 
    insert into #words select substring(@test, @count, 1) 
    select @count = @count + 1 
end 

select * from #words 

drop table #words 
+0

謝謝,你。它也適用,但我想避免使用臨時表。我想我可以使用變量表。 +1 –

0

請,請避免引用系統表,在系統數據庫專門系統表。事實上,上述可能是選擇的答案不會在一個Visual Studio編譯2013數據庫項目

表變量都很好,但遞歸的CTE是答案:

DECLARE @str VARCHAR(max) 
SET @str = 'QWERTY AnotherWord' 
WITH Split(stpos,endpos) 
AS(
SELECT 1 AS stpos, 2 AS endpos 
UNION ALL 
SELECT endpos, endpos+1 
FROM Split 
WHERE endpos <= LEN(@str) 
) 
SELECT 
    'character' = SUBSTRING(@str,stpos,COALESCE(NULLIF(endpos,0),LEN(@str)+1)-stpos) 
    ,'charindex' = stpos 
FROM Split 

儘管如此,對於使用上面的代碼是爲了獲得一個表格,裏面包含了代表用戶不同權限的字母。這不是做這件事的方法。用一個ID,一個許可代碼和一個描述製作一張表,然後在用戶表和新的權限表之間建立一個鏈接表。這給你相同的能力,並不會讓你解決這樣的愚蠢問題。

1
Declare @word nvarchar(max) 
Select @word = 'Hello This is the test'; 

with cte (Number)as 
(Select 1 
union all 
select Number +1 From cte where number <len(@word) 
) 
select * from Cte Cross apply (Select SUBSTRING(@word,number,1)) as J(Letter) 
+0

通常情況下,如果答案包含對代碼意圖做什麼的解釋,以及爲什麼解決問題而不介紹其他問題,則答案會更有幫助。 – Peter

+0

好的解決方案,使用交叉申請和cte。 – Matthias