如何使用 CROSS APPLY 在 SQL 中将多个逗号分隔的列拆分为单独的行
How to split more than one comma separated column as a separate row in SQL using CROSS APPLY
我有一个 table 有以下几行
Name
Phones
Courses
ABC
123, 456
HTML, Java
XYZ
321, 654
PHP, CSS
现在我想编写一个 SELECT 查询,以将这些逗号分隔 Phone 并将课程作为单独的行。通过使用这个 SELECT 查询,我得到的结果一直到 Phone 列,但停留在第 2 列。 Select查询是
SELECT
Name,
value phone,
courses
FROM
tblName
CROSS APPLY STRING_SPLIT(phones, ',');
此查询显示以下结果:
Name
Phones
Courses
ABC
123
HTML, Java
ABC
456
HTML, Java
XYZ
321
PHP, CSS
XYZ
654
PHP, CSS
请帮助我将课程列拆分为 Phones 并希望产生以下结果:
Name
Phones
Courses
ABC
123
HTML
ABC
456
HTML
ABC
123
Java
ABC
456
Java
XYZ
321
PHP
XYZ
654
PHP
XYZ
321
CSS
XYZ
654
CSS
因为 - 根据您的描述 - 您使用了 CROSS APPLY
并且您的查询已成功执行,这意味着您使用的是 SQL 服务器数据库,而不是我的 SQL。您可以执行两次 CROSS APPLY
以获得预期结果。这将产生您在问题中显示的结果:
SELECT name, phone, value courses FROM
(SELECT name, value phone, courses
FROM tblName CROSS APPLY STRING_SPLIT(phones, ',')) x
CROSS APPLY STRING_SPLIT(courses, ',')
ORDER BY name, courses, phone;
您可以在此处验证:db<>fiddle
但这是非常冒险的,你真的应该避免在一栏中出现这样的 comma-separated 内容。我强烈建议将来为不同的值创建单独的列。
好吧,我自己找到了解决方案。
这是工作查询:
SELECT
t1.name,
t1.phone,
value course
FROM
(SELECT
first_name,
value phone,
courses
FROM
tblName
CROSS APPLY STRING_SPLIT(phones, ',')) t1
CROSS APPLY STRING_SPLIT(t1.courses, ',');
谢谢大家
我有一个 table 有以下几行
Name | Phones | Courses |
---|---|---|
ABC | 123, 456 | HTML, Java |
XYZ | 321, 654 | PHP, CSS |
现在我想编写一个 SELECT 查询,以将这些逗号分隔 Phone 并将课程作为单独的行。通过使用这个 SELECT 查询,我得到的结果一直到 Phone 列,但停留在第 2 列。 Select查询是
SELECT
Name,
value phone,
courses
FROM
tblName
CROSS APPLY STRING_SPLIT(phones, ',');
此查询显示以下结果:
Name | Phones | Courses |
---|---|---|
ABC | 123 | HTML, Java |
ABC | 456 | HTML, Java |
XYZ | 321 | PHP, CSS |
XYZ | 654 | PHP, CSS |
请帮助我将课程列拆分为 Phones 并希望产生以下结果:
Name | Phones | Courses |
---|---|---|
ABC | 123 | HTML |
ABC | 456 | HTML |
ABC | 123 | Java |
ABC | 456 | Java |
XYZ | 321 | PHP |
XYZ | 654 | PHP |
XYZ | 321 | CSS |
XYZ | 654 | CSS |
因为 - 根据您的描述 - 您使用了 CROSS APPLY
并且您的查询已成功执行,这意味着您使用的是 SQL 服务器数据库,而不是我的 SQL。您可以执行两次 CROSS APPLY
以获得预期结果。这将产生您在问题中显示的结果:
SELECT name, phone, value courses FROM
(SELECT name, value phone, courses
FROM tblName CROSS APPLY STRING_SPLIT(phones, ',')) x
CROSS APPLY STRING_SPLIT(courses, ',')
ORDER BY name, courses, phone;
您可以在此处验证:db<>fiddle
但这是非常冒险的,你真的应该避免在一栏中出现这样的 comma-separated 内容。我强烈建议将来为不同的值创建单独的列。
好吧,我自己找到了解决方案。 这是工作查询:
SELECT
t1.name,
t1.phone,
value course
FROM
(SELECT
first_name,
value phone,
courses
FROM
tblName
CROSS APPLY STRING_SPLIT(phones, ',')) t1
CROSS APPLY STRING_SPLIT(t1.courses, ',');
谢谢大家