T-SQL将Word拆分为字符

时间:2011-12-15 09:28:14

标签: string tsql split

我到处搜索过,我无法在任何地方找到这种实现方式。

我想说的是: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

5 个答案:

答案 0 :(得分:25)

这样做:

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'

答案 1 :(得分:4)

在这里你拥有它:

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

答案 2 :(得分:1)

请避免引用系统表,特别是系统数据库中的系统表。实际上,上面选择的答案可能无法在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,权限代码和描述的表,然后在users表和新权限表之间创建一个链接表。这给了你相同的能力,并没有让你解决这样的愚蠢问题。

答案 3 :(得分: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)

答案 4 :(得分:1)

这是一个表值函数(源自aF的临时表实现)。它与aF的实现略有不同,因为它以@count=1开头;这排除了多余的领导空间。

CREATE FUNCTION [dbo].[Chars] (@string VARCHAR(max)) 
RETURNS @chars TABLE (character CHAR) 
AS 
  BEGIN 
      DECLARE @count INT, 
              @total INT 

      SELECT @total = Len(@string), 
             @count = 1 

      WHILE @count <= @total 
        BEGIN 
            INSERT INTO @chars 
            SELECT Substring(@string, @count, 1) 

            SELECT @count = @count + 1 
        END 

      RETURN 
  END 

用法:

SELECT * FROM dbo.chars('QWERTY AnotherWord')