如何根据以下条件编写SQL查询?

时间:2019-06-08 18:37:00

标签: sql sql-server tsql

我有一个数据库表,其中的列tags包含诸如以下的值:

"AutoMNRP, MNRP"
"Macro, MNRP"
"AutoMNRP, Micro"
"Macro, Micro"

其中"...."代表一个字符串。

我想编写一个SQL查询,以便它过滤掉所有带有MNRP标签的结果。我该怎么办?

我尝试了一个SQL运算符,但如果我想删除MNRP标记,它还会过滤掉AutoMNRP标记。

在查询的最后,我需要具有-

的结果
"AutoMNRP, Micro"
"Macro, Micro".

(过滤出MNRP的结果。)

2 个答案:

答案 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    |
+-----------------+

Live Demo

您也(如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,';