Как писать SQL-запросы в отношении следующих условий? - PullRequest
0 голосов
/ 08 июня 2019

У меня есть таблица базы данных, в которой столбец tags содержит такие значения, как:

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

где "...." представляет строку.

Я хочу написать SQL-запрос таким образом, чтобы он отфильтровывал все результаты, содержащие тег MNRP. Как я могу это сделать?

Я пытался использовать не похожий на него оператор SQL, но если я хочу удалить тег MNRP, он также отфильтровывает тег AutoMNRP.

В последнем запросе мне нужны результаты с -

"AutoMNRP, Micro"
"Macro, Micro".

(Результаты, когда MNRP отфильтровывается.)

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Правильный ответ на это - исправить ваш дизайн, вы не должны хранить данные, подобные этим (через запятую), потому что ваша таблица должна быть похожа (и дубликаты должны быть удалены и обработаны тоже)

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

Вы также (как Ларну указать на) сделать как

;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,';
1 голос
/ 08 июня 2019

В 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...