B 列中的值列在 C 列中,C 列是逗号分隔的列表

问题描述 投票:0回答:1

我有一个 SQL 表,其中 C 列在逗号分隔列表中有多个值。我一直在尝试编写一个查询,询问 A 列中的值是否列在 B 列中,然后填充这些行。我已经尝试过

CONTAINS
和其他语句,但它们要么不填充我的表中的任何行,要么填充所有行。然后,我最终在
WHERE
/
LIKE
语句中写出了 B 列中的每个不同值,但它相当冗长。我正在使用 SQL Server Management Studio。这是一个示例表,显示了我的数据:

A 栏 B 栏 C 栏
1 苹果 苹果、橙子
2 橙子 苹果、葡萄。
3 葡萄 橙子、苹果

根据此数据,我期望在结果中填充 2 和 3,因为 2 - 橙子未在 c 列中列出,而 3 - 葡萄未在 c 列中列出

我目前正在使用此查询来获取我需要的结果,但是我担心如果通配符不评估所有值,可能会丢失一些值。

SELECT *
FROM MyTable
WHERE column_b NOT LIKE '%apples%'
  AND column_c LIKE 'apples%'
    OR
  column_b NOT LIKE '%oranges%'
  AND column_c LIKE 'oranges%'
    OR
  column_b NOT LIKE '%grapes%'
  AND column_c LIKE 'grapes%'
ORDER BY column_b;

有没有办法简化这个语句,以根据我的样本数据得到我想要的结果 2 和 3?或者还有其他写法吗?

sql sql-server t-sql ssms
1个回答
0
投票

如果您使用 STRING_SPLIT 函数,这绝对可以简化:

SELECT * FROM MyTable
LEFT JOIN STRING_SPLIT(MyTable.Column_C, ',') AS c
    ON LTRIM(RTRIM(c.value)) = MyTable.Column_B
WHERE c.value IS NULL
ORDER BY MyTable.Column_B;

这里,

STRING_SPLIT(MyTable.Column_C)
根据逗号分隔符将C列中的值拆分为单独的行,然后修剪掉所有空格。通过使用左联接,您可以从表中获取所有行,以及 C 列中的匹配拆分值。如果没有匹配项,结果将包含该拆分值的 NULL。
WHERE c.value IS NULL
子句筛选结果以仅包含 MyTable 中的行,其中 B 列中的值不存在于 C 列的拆分值中。

© www.soinside.com 2019 - 2024. All rights reserved.