【问题标题】:SQL Server : string to rows with delimiter?SQL Server:字符串到带分隔符的行?
【发布时间】:2016-10-08 11:47:05
【问题描述】:

在 SQL Server 2016 中有一个名为 STRING_SPLIT (Transact-SQL) 的函数。

回答我的问题可以很好地使用这个函数。

很遗憾,我们只有 SQL Server 2012。

SELECT 
    email,
    [Special ftg],
    [Special OrgCode],
    [Special SalaryCode]
FROM 
    Employee

我怎样才能得到这个?

email             Special ftg                             Special OrgCode    Special SalaryCode 
-----------------------------------------------------------------------------------------
test@gmail.com    4;200;210;220;250;275;1100;1101;1102    14000000000          1

进入这个:

分隔符是分号,应该是所有列的分隔符。

【问题讨论】:

  • 如果你在网上搜索的话,很多东西,this 就是其中之一。
  • 我在网上搜索过,但没有找到简单的解决方案。我在那里问了一个问题。你的链接对我来说不容易理解

标签: sql-server string tsql rows delimiter


【解决方案1】:

您可以将[Special ftg] 转换为 XML ant 然后使用 OUTER APPLY:

;WITH cte AS (
SELECT  email,
        CAST('<p>'+REPLACE([Special ftg],';','</p><p>')+'</p>'as xml) as [Special ftg],
        [Special OrgCode],
        [Special SalaryCode]
FROM Employee
)

SELECT  c.email,
        t.c.value('.','int') [Special ftg],
        NULL [Special OrgCode],
        NULL [Special SalaryCode]
FROM cte c
OUTER APPLY [Special ftg].nodes('/p') as t(c)
UNION ALL
SELECT  c.email,
        NULL,
        c.[Special OrgCode],
        NULL
FROM cte c
UNION ALL
SELECT  c.email,
        NULL,
        NULL,
        c.[Special SalaryCode]
FROM cte c
ORDER BY email,[Special SalaryCode],[Special OrgCode],[Special ftg]

输出:

email           Special ftg Special OrgCode Special SalaryCode
test@gmail.com  4           NULL            NULL
test@gmail.com  200         NULL            NULL
test@gmail.com  210         NULL            NULL
test@gmail.com  220         NULL            NULL
test@gmail.com  250         NULL            NULL
test@gmail.com  275         NULL            NULL
test@gmail.com  1100        NULL            NULL
test@gmail.com  1101        NULL            NULL
test@gmail.com  1102        NULL            NULL
test@gmail.com  NULL        14000000000     NULL
test@gmail.com  NULL        NULL            1

【讨论】:

  • 您好,谢谢。我尝试稍微更改您的脚本,但出现错误。 SELECT A.[email], Split.A.value(';', 'NVARCHAR(300)') AS [Special ftg] FROM (SELECT email, CAST ('' + REPLACE ([Special ftg], ' ;', '') + '' AS XML) AS string FROM Employee) AS A CROSS APPLY string.nodes ('/M') AS Split(A) ORDER BY 1, 2 错误是这样的:XQuery [A.string.value()]: Syntax error near ';'
  • split.A.value('.',... 必须有。不是;
  • 非常感谢。我会将您的答案标记为正确:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-04
相关资源
最近更新 更多