НЕ НРАВИТСЯ И НРАВИТСЯ, не возвращаясь к противоположному результату

У меня есть таблица с 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

  • Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%')
    
  • select * from tbl1
    where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL
    

Ответ 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)