我有一个 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?或者还有其他写法吗?
如果您使用 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 列的拆分值中。