НЕ НРАВИТСЯ И НРАВИТСЯ, не возвращаясь к противоположному результату
У меня есть таблица с 200 записями, из которых 10 записей содержат текст, содержащий слово "TAX".
Когда я выполняю
Select * from tbl1 WHERE [TextCol] LIKE '%TAX%'
то я получаю результат с этими 10 записями правильно.
Но когда я пытаюсь исключить эти записи
Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%'
он возвращает только 100 записей, а не 190.
Ответы
Ответ 1
Это возвращает правильный результат?
Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%'
Я считаю, что значения NULL
здесь являются проблемой, если столбец содержит их, то NULL NOT LIKE '%TAX%'
вернет UNKNOWN/NULL
и, следовательно, не будет выбран.
Советую вам прочитать обработку с NULL
значениями или .
Как сказал @ughai, если производительность является проблемой, вы также можете использовать:
Select * from tbl1
WHERE [TextCol] NOT LIKE '%TAX%'
OR [TextCol] IS NULL
Ответ 2
(A) Операторы сравнения SQL приводят к трем возможным значениям: True, False и Unknown. Если один или оба операнда NULL
, тогда результат будет Unknown. Рассмотрим следующий пример, где мы сравниваем некоторые значения (возраст человека) с константой (18):
21 >= 18 -- True
15 >= 18 -- False
NULL >= 18 -- Unknown
Как вы можете видеть, база данных может/не решить, будет ли NULL
больше/равно 18.
(B) База данных будет возвращать только строки, где предложение WHERE
имеет значение True. Инвертирование выражения (например, WHERE age >= 18
изменено на WHERE age < 18
) не влияет на результаты Неизвестного.
Вы можете использовать IS [NOT] NULL
для соответствия значениям NULL
. Следующий запрос будет выбирать строки, в которых столбец не соответствует шаблону ИЛИ столбец равен NULL:
WHERE [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
Функции, такие как ISNULL
и COALESCE
, могут быть использованы для преобразования NULL
в некоторое значение.
Ответ 3
Случилось и со мной! после того, как я обнял его, я узнал, что это было из-за нулевых значений, поэтому вы можете использовать этот запрос, чтобы избежать этого:
WHERE CASE WHEN [TextCol] IS NULL
THEN 'default'
ELSE [TextCol]
END NOT LIKE '%TAX%'
Ответ 4
Ответ 5
Вам нужно также проверить значения NULL:
[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
Это также должно заботиться о нулевых значениях, поэтому, вероятно, вы не получили все строки на выходе.
Ответ 6
У меня была такая же проблема с оператором IN
в простом столбце int с нулями. Я обнаружил, что это не так, как я думал. (Я мог бы сказать по количеству строк)
select * from Dest where id in(select id from Source)
select * from Dest where id NOT in(select id from Source)
Чтобы обратить друг друга, я должен был переписать их так:
select * from Dest where isnull(id,-2) in(select isnull(id,-1) from Source)
select * from Dest where isnull(id,-2) NOT in(select isnull(id,-1) from Source)