gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:25:02 25 4
gpt4 key购买 nike

我有一个像这样的 SQL 表:

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

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

<表类=“s-表”><标题>其他ID分割数据 <正文>cdef123-...18cdef123-...20cdef123-...224554a24-...174554a24-...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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com