2016-11-02 4 views
58

У меня есть таблица с 200 записями, из которых 10 записей имеют текст, содержащий слово «НАЛОГ».НЕ НРАВИТСЯ И НРАВИТСЯ, НЕ ОТКРЫВАЮТСЯ ОТНОСИТЕЛЬНЫЙ РЕЗУЛЬТАТ

Когда я выполнение

Select * from tbl1 WHERE [TextCol] LIKE '%TAX%' 

тогда я получаю набор результатов с помощью этих 10 записей правильно.

Но когда я пытаюсь исключить эти записи по

Select * from tbl1 WHERE [TextCol] NOT LIKE '%TAX%' 

это возвращение 100 записей только вместо 190.

+42

У вас есть значения «null» для этого столбца? – musefan

+0

Да, в этом столбце есть нулевые значения. – Shanka

+1

Попробуйте избегать использования '%' в начале строки поиска, когда это возможно. Это довольно тяжело. –

ответ

73

ли это вернуть правильный результат?

Select * from tbl1 WHERE COALESCE([TextCol],'-1') NOT LIKE '%TAX%' 

NULL Я считаю, что ценности являются проблемой здесь, если столбец содержит их, то NULL NOT LIKE '%TAX%'UNKNOWN/NULL вернется и, следовательно, не будет выбран.

Советую вам прочитать о handling with NULL values, или here.

Как @ughai предложил, если производительность является проблемой, вы можете также использовать:

Select * from tbl1 
    WHERE [TextCol] NOT LIKE '%TAX%' 
    OR [TextCol] IS NULL 
+16

Я бы предложил использовать '[TextCol] NOT LIKE '% TAX%' ИЛИ ​​[TextCol] IS NULL', поскольку он имел бы лучшую производительность, если пользователь хочет включить значения« NULL » – ughai

+3

Он сказал« 190 записей », поэтому я сомневаюсь performace - проблема, но все же отредактирована, так как другие могут прочитать этот ответ @ughai. – sagi

+1

Спасибо! NULL был проблемой. – Shanka

1
  1. Select * from tbl1 
    WHERE ([TextCol] NOT LIKE '%TAX%') AND ([TextCol] NOT LIKE '%TAX%') 
    
  2. select * from tbl1 
    where [TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL 
    
+17

В чем смысл 'WHERE ([TextCol] НЕ НРАВИТСЯ«% НАЛОГОВЫХ% ») И ([TextCol] НЕ НРАВИТСЯ«% НАЛОГА% »)'? – moopet

+4

Хотя этот фрагмент кода может решить вопрос, включая объяснение [действительно помогает] (// meta.stackexchange.com/q/114762), чтобы улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

0

Вы должны проверить NULL значений, а также:

[TextCol] NOT LIKE '%TAX%' OR [TextCol] IS NULL 

Это должно заботиться о нулевых значений также, вероятно, почему вы не получили все строки на выходе.

+3

Хотя этот фрагмент кода может решить вопрос, включая объяснение [действительно помогает] (// meta.stackexchange.com/q/114762), чтобы улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

18

(A) Операторы сравнения SQL приводят к трем возможным значениям: True, False и Unknown. Если один или оба операнда равны NULL, тогда результат будет неизвестным. Рассмотрим следующий пример, где мы сравниваем некоторые значения (возраст человека) с постоянной (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 

такие функции, как и ISNULLCOALESCE могут быть использованы для трансформации NULL в какую-то ценность.

+4

Коррекция: все операции с значениями «NULL» приводят к ** 'UNKNOWN' ** ... за исключением случаев, когда они не являются, например, 'SELECT COUNT (TextCol) AS tally FROM tbl1' – onedaywhen

+0

Ваше редактирование« все операции »->« операторы сравнения »хорошо +1 – onedaywhen

2

Случись со мной тоже! после того, как я повредил его, я узнал, что это из-за нулевых значений, поэтому вы можете использовать этот запрос, чтобы избежать этого:

WHERE CASE WHEN [TextCol] IS NULL 
      THEN 'default' 
      ELSE [TextCol] 
     END NOT LIKE '%TAX%' 

 Смежные вопросы

  • Нет связанных вопросов^_^