sql-server - 将逗号分隔的字符串转换为单独的行

标签 sql-server csv tsql split

我有一个像这样的 SQL 表:

<表类=“s-表”> <标题> 某个ID 其他ID 数据 <正文> abcdef-..... cdef123-... 18,20,22 abcdef-..... 4554a24-... 17,19 987654-..... 12324a2-... 13,19,20

是否有一个查询可以执行类似 SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......' 的查询返回单独的行,如下所示:

<表类=“s-表”> <标题> 其他ID 分割数据 <正文> cdef123-... 18 cdef123-... 20 cdef123-... 22 4554a24-... 17 4554a24-... 19

基本上将我的数据在逗号处分割成单独的行?

我知道存储 comma-separated将字符串写入关系数据库听起来很愚蠢,但消费者应用程序中的正常用例使其非常有用。

我不想在应用程序中进行拆分,因为我需要分页,因此我想在重构整个应用程序之前探索一些选项。

这是 SQL Server 2008 (非 R2)。

最佳答案

您可以使用 SQL Server 中精彩的递归函数:

<小时/>

示例表:

CREATE TABLE Testdata
(
    SomeID INT,
    OtherID INT,
    String VARCHAR(MAX)
);

INSERT Testdata SELECT 1,  9, '18,20,22';
INSERT Testdata SELECT 2,  8, '17,19';
INSERT Testdata SELECT 3,  7, '13,19,20';
INSERT Testdata SELECT 4,  6, '';
INSERT Testdata SELECT 9, 11, '1,2,3,4';
<小时/>

查询

WITH tmp(SomeID, OtherID, DataItem, String) AS
(
    SELECT
        SomeID,
        OtherID,
        LEFT(String, CHARINDEX(',', String + ',') - 1),
        STUFF(String, 1, CHARINDEX(',', String + ','), '')
    FROM Testdata
    UNION all

    SELECT
        SomeID,
        OtherID,
        LEFT(String, CHARINDEX(',', String + ',') - 1),
        STUFF(String, 1, CHARINDEX(',', String + ','), '')
    FROM tmp
    WHERE
        String > ''
)
SELECT
    SomeID,
    OtherID,
    DataItem
FROM tmp
ORDER BY SomeID;
-- OPTION (maxrecursion 0)
-- normally recursion is limited to 100. If you know you have very long
-- strings, uncomment the option
<小时/>

输出

 SomeID | OtherID | DataItem 
--------+---------+----------
 1      | 9       | 18       
 1      | 9       | 20       
 1      | 9       | 22       
 2      | 8       | 17       
 2      | 8       | 19       
 3      | 7       | 13       
 3      | 7       | 19       
 3      | 7       | 20       
 4      | 6       |          
 9      | 11      | 1        
 9      | 11      | 2        
 9      | 11      | 3        
 9      | 11      | 4        

关于sql-server - 将逗号分隔的字符串转换为单独的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5493510/

相关文章:

c# - 从 DataGrid 而不是从 csv 文件读取到数组/列表

excel - 在 A 相同的地方添加 B [在 excel 中]

SQL Server NULL 约束

sql-server - 如何返回与参数相同的类型

c# - 我如何解决此错误的C#

sql-server - Polybase CREATE EXTERNAL TABLE 跳过 header

SQL查询获取杂项列信息

sql-server - 要在条形图中显示的年龄范围的人数

python - Django loaddata 验证错误

sql - 如何列出VIEW中的列的源表名称(SQL Server 2005)