Sql 将字符串拆分为列中的单词

Sql 将字符串拆分为列中的单词,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,我希望在SQL Server 2014中将字符串拆分为列中的单词。我已经找到了一些解决方案,但它们都给出了成行的结果。如何将下面的字符串拆分为列 第一第二第三第四第五 您可以使用a将字符串分隔为单词,并使用单词在原始字符串中的顺序,您可以使用诸如PIVOT查询之类的CASE语句并显示为列 这是一个样本 declare @string varchar(max) = 'First Second Third Fourth Fifth' ;with cte as ( select case w

我希望在SQL Server 2014中将字符串拆分为列中的单词。我已经找到了一些解决方案,但它们都给出了成行的结果。如何将下面的字符串拆分为列

第一第二第三第四第五

您可以使用a将字符串分隔为单词,并使用单词在原始字符串中的顺序,您可以使用诸如PIVOT查询之类的CASE语句并显示为列

这是一个样本

declare @string varchar(max) = 'First Second Third Fourth Fifth'

;with cte as (
select
    case when id = 1 then val end as Col1,
    case when id = 2 then val end as Col2,
    case when id = 3 then val end as Col3,
    case when id = 4 then val end as Col4,
    case when id = 5 then val end as Col5
from dbo.split( @string,' ')
)
select
    max(Col1) as Col1,
    max(Col2) as Col2,
    max(Col3) as Col3,
    max(Col4) as Col4,
    max(Col5) as Col5
from cte
如果无法创建UDF,可以在SQL代码中使用如下逻辑

请注意,如果您的数据位于数据库表列中,则只需替换第一列中的列内容即可


您可以使用XML并根据元素的位置获取它们:

DECLARE @YourString VARCHAR(100)='First Second Third Fourth Fifth';

WITH StringAsXML AS
(
    SELECT CAST('<x>' + REPLACE((SELECT @YourString AS [*] FOR XML PATH('')),' ','</x><x>') + '</x>' AS XML) TheXml
)
SELECT TheXml.value('x[1]/text()[1]','nvarchar(max)') AS FirstElement
      ,TheXml.value('x[2]/text()[1]','nvarchar(max)') AS SecondElement
      ,TheXml.value('x[3]/text()[1]','nvarchar(max)') AS ThirdElement
      ,TheXml.value('x[4]/text()[1]','nvarchar(max)') AS FourthElement
      ,TheXml.value('x[5]/text()[1]','nvarchar(max)') AS FifthElement
FROM StringAsXML;
更新2:最小的完全内联和位置安全拆分器我知道 试试这个:

DECLARE @inp VARCHAR(200) = 'First Second Third Fourth Fifth';
DECLARE @dlmt VARCHAR(100)=' ';

;WITH
a AS (SELECT n=0, i=-1, j=0 UNION ALL SELECT n+1, j, CHARINDEX(@dlmt, @inp, j+1) FROM a WHERE j > i),
b AS (SELECT n, SUBSTRING(@inp, i+1, IIF(j>0, j, LEN(@inp)+1)-i-1) s FROM a WHERE i >= 0)
SELECT * FROM b;
为了让它完整:上面的微型分离器与枢轴组合:

您可以将parsename函数用作:

create table tab ( str varchar(100));

insert into tab values('First Second Third Fourth Fifth');

with t as
(
select replace(str,' ','.') as str
  from tab
)    
Select substring(str,1,charindex('.',str)-1) as col_first,
       parsename(substring(str,charindex('.',str)+1,len(str)),4) as col_second,
       parsename(substring(str,charindex('.',str)+1,len(str)),3) as col_third,
       parsename(substring(str,charindex('.',str)+1,len(str)),2) as col_fourth,
       parsename(substring(str,charindex('.',str)+1,len(str)),1) as col_fifth
  from t;

col_first   col_second  col_third   col_fourth  col_fifth
---------   ----------  ---------   ----------  ---------
First       Second      Third       Fourth      Fifth
注意:首先,需要将主弦拆分为最多3个三点的部分。character否则该函数不起作用。这是对parsename的限制


你好,艾拉珀,谢谢你的回复。我无权在DB中创建函数。您可以修改查询吗?我添加了第二个查询JessicaHi Eraper,更新后的查询可以工作,但只需提一下:如果字符串包含禁止使用的字符,如&这将中断。这可能通过所有内部测试并进入生产阶段。。。此外,它似乎是可靠的,但没有关于行号的文档,这将保证元素按预期顺序返回。。。您可以看看我的答案中关于位置安全内联拆分器的最后一个示例。谢谢Shnugo,使用SELECT@string AS[*]for XML PATH消除类似字符的技巧非常有趣!亲爱的杰西卡。对于您将来的问题,请记住,这个社区的成员在这里自愿利用空闲时间帮助其他开发人员。对于提出问题的人来说,问题是否紧急,我们不关心,也不应该关心。此外,如果你想快速得到好的帮助,问一些好问题。您可以从阅读开始,特别是有关SQL的问题,请阅读meta.dba.stackexchange上的优秀文章。感谢您阅读反馈:在您的帖子历史记录中,有几次有人要求查看您最初的尝试,或要求澄清,但这些通常不会提供。当被问到问题时,请养成改变问题的习惯。给出的例子清楚地表明,问题不止四个部分。PARSENAME是-当然这里的错误选择。。。在我看来,几乎在任何情况下,字符串拆分都是错误的选择…@Shnugo因此,我将字符串拆分为两部分,每个部分最多包含三个点。@Shnugo拆分一次没关系。我不知道您拆分一次是什么意思。。。对我来说,这是一个错误的工具,因为它是具体的和完全不直观的反向编号。
;WITH
a AS (SELECT n=0, i=-1, j=0 UNION ALL SELECT n+1, j, CHARINDEX(@dlmt, @inp, j+1) FROM a WHERE j > i),
b AS (SELECT n, SUBSTRING(@inp, i+1, IIF(j>0, j, LEN(@inp)+1)-i-1) s FROM a WHERE i >= 0)

SELECT p.* 
FROM b
PIVOT(MAX(s) FOR n IN([1],[2],[3],[4],[5])) p;
create table tab ( str varchar(100));

insert into tab values('First Second Third Fourth Fifth');

with t as
(
select replace(str,' ','.') as str
  from tab
)    
Select substring(str,1,charindex('.',str)-1) as col_first,
       parsename(substring(str,charindex('.',str)+1,len(str)),4) as col_second,
       parsename(substring(str,charindex('.',str)+1,len(str)),3) as col_third,
       parsename(substring(str,charindex('.',str)+1,len(str)),2) as col_fourth,
       parsename(substring(str,charindex('.',str)+1,len(str)),1) as col_fifth
  from t;

col_first   col_second  col_third   col_fourth  col_fifth
---------   ----------  ---------   ----------  ---------
First       Second      Third       Fourth      Fifth