Оператор SQL Not Like не работает - PullRequest
38 голосов
/ 28 октября 2009

У меня есть следующий код в хранимой процедуре.

WHERE
    WPP.ACCEPTED = 1 AND
    WPI.EMAIL LIKE '%@MATH.UCLA.EDU%' AND
    (WPP.SPEAKER = 0 OR
    WPP.SPEAKER IS NULL) AND
    WPP.COMMENT NOT LIKE '%CORE%' AND
    WPP.PROGRAMCODE = 'cmaws3'

Оператор NOT LIKE не работает, и да, прежде чем кто-либо скажет что-либо, есть элементы со столбцом COMMENT, которые не включают в себя CORE, а все остальные столбцы в порядке.

Кто-нибудь знает, что с этим не так?

Ответы [ 5 ]

56 голосов
/ 28 октября 2009

Если WPP.COMMENT содержит NULL, условие не будет соответствовать.

Этот запрос:

SELECT  1
WHERE   NULL NOT LIKE '%test%'

ничего не вернет.

В столбце NULL оба значения LIKE и NOT LIKE для любой строки поиска возвращают NULL.

Не могли бы вы опубликовать соответствующие значения строки, которые, по вашему мнению, должны быть возвращены, но это не так?

6 голосов
/ 28 октября 2009

Является ли значение вашего конкретного столбца COMMENT нулевым?

Иногда NOT LIKE не знает, как правильно вести себя вокруг нулей.

5 голосов
/ 03 апреля 2012

Я только что столкнулся с той же проблемой и решил ее, но не раньше, чем нашел этот пост. И, учитывая, что на ваш вопрос на самом деле не было ответа, вот мое решение (которое, будем надеяться, сработает для вас или любого, кто ищет то же, что и я;

Вместо;

... AND WPP.COMMENT NOT LIKE '%CORE%' ...

Постарайтесь;

... AND NOT WPP.COMMENT LIKE '%CORE%' ...

По сути, перемещение «НЕ» на другую сторону поля, которое я оценивал, сработало для меня.

4 голосов
/ 31 января 2014

Просто сталкивайтесь с этим, ответ прост, используйте ISNULL. SQL не будет возвращать строки, если поле, которое вы тестируете, не имеет значения (в некоторых записях) при выполнении сравнения текста, например:

WHERE wpp.comment NOT LIKE '%CORE%'

Итак, вы временно заменили значение в null (пустых) записях с помощью команды ISNULL, например

WHERE (ISNULL(wpp.comment,'')) NOT LIKE '%CORE%'

Затем будут показаны все ваши записи, которые имеют нулевые значения, и пропущены все записи, которые соответствуют вашим критериям. Если вы хотите, вы можете поместить что-нибудь в запятую, чтобы помочь вам вспомнить, например,

WHERE (ISNULL(wpp.comment,'some_records_have_no_value')) NOT LIKE '%CORE%'
1 голос
/ 28 октября 2009

mattgcon,

Должно ли работать, вы получите больше строк, если вы запускаете тот же SQL с закомментированной строкой "НЕ ЛЮБЛЮ"? Если нет, проверьте данные. Я знаю, что вы упомянули в своем вопросе, но проверьте, что фактический оператор SQL использует это предложение. Другие ответы с NULL также являются хорошей идеей.

...