用于将字符串拆分为行和列的 SQL 查询

标签 sql sql-server tsql

我有一个以下格式的字符串:

A:B:C;J:K;P:L:J;

我想在冒号(:)之后分割字符串,并在分号(;)之后开始一个新行。 谁能帮我查询一下。

输出示例:

A B C

J K

P L J

最佳答案

试试这个 -

解决方案#1:

DECLARE @t VARCHAR(100)
SELECT @t = 'A:B:C;J:K;P:L:J;'

SELECT * 
FROM (
     SELECT token = t.c.value('.', 'VARCHAR(100)')
     FROM
     (
          SELECT xmls = CAST('<t>' + 
               REPLACE(
                    REPLACE(@t, ':', ' '), 
                    ';', 
                    '</t><t>') + '</t>' AS XML)
     ) r
     CROSS APPLY xmls.nodes('/t') AS t(c)
) t
WHERE t.token != ''

输出:

----------
A B C
J K
P L J

解决方案#2:

DECLARE @t VARCHAR(100)
SELECT @t = 'A:B:C;J:K;P:L:J;'

PRINT REPLACE(REPLACE(@t, ':', ' '), ';', CHAR(13) + CHAR(13))

输出:

A B C

J K

P L J

解决方案#3:

DECLARE @t VARCHAR(100)
SELECT @t = 'A:B:C;J:K;P:L:J;'

SELECT [1], [2], [3]
FROM (
     SELECT 
            t2.id
          , t2.name
          , rn2 = ROW_NUMBER() OVER (PARTITION BY t2.id ORDER BY 1/0)  
     FROM (
          SELECT 
                id = t.c.value('@n', 'INT')
              , name = t.c.value('@s', 'CHAR(1)')
          FROM (
              SELECT x = CAST('<t s = "' + 
                    REPLACE(token + ':', ':', '" n = "' + CAST(rn AS VARCHAR(10)) 
                    + '" /><t s = "') + '" />' AS XML) 
               FROM (
                    SELECT 
                           token = t.c.value('.', 'VARCHAR(100)')
                         , rn = ROW_NUMBER() OVER (ORDER BY 1/0)
                    FROM (
                         SELECT x = CAST('<t>' + REPLACE(@t, ';', '</t><t>') + '</t>' AS XML)
                    ) r
                    CROSS APPLY x.nodes('/t') t(c)
               ) t
          ) d
          CROSS APPLY x.nodes('/t') t(c)
     ) t2
     WHERE t2.name != ''
) t3
PIVOT (
     MAX(name) FOR rn2 IN ([1], [2], [3])
) p

输出:

1    2    3
---- ---- ----
A    B    C
J    K    NULL
P    L    J

关于用于将字符串拆分为行和列的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17721723/

相关文章:

java - 其中哪一个最好用,为什么?

sql-server - SQL Server 2016 奇怪的行为 - OR 条件给出 0 行但 AND 条件给出一些行

json - SQL Server- JSON 对象同时包含字符串和数组 : how to get result with single query?

sql - T-sql如何获取所有行 'between'另外两行

sql-server - MSSQL 创建列并有条件地递增列

MySQL - 在初始 auto_increment 值之前保留 ID

sql - 在 SQL Server 中每小时计算行数,并以完整的日期时间值作为结果

mysql - sql 如何在同一列中应用不同条件的 sum()

c# - 使用 SqlBulkCopy 将 CSV 文件导入 SQL Server

sql - 在 SQL 中。为什么带有通配符的 'Like' 语句不起作用?