2011-12-15 38 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