我有一个数据库表,其中的列tags
包含诸如以下的值:
"AutoMNRP, MNRP"
"Macro, MNRP"
"AutoMNRP, Micro"
"Macro, Micro"
其中"...."
代表一个字符串。
我想编写一个SQL查询,以便它过滤掉所有带有MNRP标签的结果。我该怎么办?
我尝试了一个SQL运算符,但如果我想删除MNRP标记,它还会过滤掉AutoMNRP标记。
在查询的最后,我需要具有-
的结果"AutoMNRP, Micro"
"Macro, Micro".
(过滤出MNRP的结果。)
答案 0 :(得分:1)
在SQL Server 2016+中,您可以使用STRING_SPLIT
函数。因此,您可以将一条记录乘以tags
列中分隔值的数量,然后再应用一个简单的WHERE
子句。像这样:
WITH cte AS
(
SELECT Id, SingleTag
FROM table_name CROSS APPLY STRING_SPLIT(tags, ',')
)
SELECT * FROM cte WHERE SingleTag = 'MNRP'
答案 1 :(得分:1)
正确的答案是修复您的设计,您不应该像这样存储数据(用逗号分隔),因为您的表应该像这样(重复项也应该被删除和处理)
+----------+
| Data |
+----------+
| AutoMNRP |
| MNRP |
| Macro |
| MNRP |
| AutoMNRP |
| Micro |
| Macro |
| Micro |
+----------+
但是...这是一种可以满足您要求的方法
;WITH T(Str) AS
(
SELECT 'AutoMNRP, MNRP' UNION ALL
SELECT 'Macro, MNRP' UNION ALL
SELECT 'AutoMNRP, Micro' UNION ALL
SELECT 'Macro, Micro'
)
SELECT Str
FROM T
WHERE Str NOT LIKE '% MNRP,%'
AND
Str NOT LIKE '%, MNRP';
返回:
+-----------------+
| Str |
+-----------------+
| AutoMNRP, Micro |
| Macro, Micro |
+-----------------+
您也(如Larnu所指)
;WITH T(Str) AS
(
SELECT 'AutoMNRP, MNRP' UNION ALL
SELECT 'Macro, MNRP' UNION ALL
SELECT 'AutoMNRP, Micro' UNION ALL
SELECT 'Macro, Micro'
)
SELECT Str
FROM T
WHERE CONCAT(', ', Str, ',') NOT LIKE '%, MNRP,';