【问题标题】:T-SQL Split Word into charactersT-SQL 将单词拆分为字符
【发布时间】:2012-01-21 00:21:09
【问题描述】:

我到处搜索,但在任何地方都找不到这个实现。

假设我有这个词: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

【问题讨论】:

  • 抱歉,google 和 stackoverflow 搜索没有返回任何有用的结果。另一方面,我看到这里给出的答案更好更快,更符合我对解决方案的需求。另外,我认为它更直接。
  • @PetarIvanov 这不是重复的。您链接的问题是关于在 delimiter 上拆分值。这里没有使用分隔符。

标签: string tsql split


【解决方案1】:

这样做:

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'

【讨论】:

  • 嗨@t-clausen.dk,该解决方案在 azure sql 数据库中不起作用。您还有其他选择吗?
  • @MagendranV 这是因为 azure 没有 spt_values,但它在这里的唯一目的是充当最多 2047 的数字列表;改用行生成器,例如 BabiBN 的答案(比依赖未记录的 spt_values 更安全)
  • 结合stackoverflow.com/questions/21425546 的答案,您可以使用以下查询作为 Azure SQL 数据库中的选项 select substring(ab, v.number+1, 1) from (select 'QWERTY AnotherWord' b) a join (从(值(0),(1),(2),(3),(4),(5) ,(6),(7),(8),(9)) 个(n), (VALUES(0),(1),(2),(3),(4),(5),(6 ),(7),(8),(9)) 十(n), (值(0),(1),(2),(3),(4),(5),(6),( 7),(8),(9)) 数百(n), (VALUES(0),(1),(2),(3),(4),(5),(6),(7), (8),(9)) 千(n) ) v on v.number
【解决方案2】:
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)

【讨论】:

  • 一般来说,如果答案包含对代码的用途的解释,以及为什么在不介绍其他人的情况下解决问题的原因,答案会更有帮助。
  • 很好的解决方案,使用交叉应用和 cte。
【解决方案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

【讨论】:

  • 谢谢你。它也可以,但我想避免使用临时表。我想我可以使用变量表。 +1
  • 查看我的答案以获取此表值函数版本
【解决方案4】:

这是一个表值函数(源自 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')

【讨论】:

    【解决方案5】:

    请避免引用系统表,特别是系统数据库中的系统表。事实上,上面选择的答案可能不会在 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 表和新权限表之间创建一个链接表。这给了你同样的能力,而不是让你解决这样的愚蠢问题。

    【讨论】:

      猜你喜欢
      • 2011-06-12
      • 1970-01-01
      • 2014-06-09
      • 1970-01-01
      • 2022-01-18
      • 2011-10-23
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多