如何使用 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, ',');  

谢谢大家