как '%' не принимает значение NULL

У меня есть запрос, созданный на основе ввода пользователя (передается через форму html). Это выглядит так (простой пример):

Select * From [table] Where [table].[column] like '<parameter>'

Этот параметр может быть необязательным, поэтому, если пользователь оставил соответствующее поле ввода пустым, я передаю %. Он работал нормально, пока я не столкнулся со значениями NULL. Я понимаю, что символы «%» не равны нулю, но в этом случае я хотел бы рассматривать NULL как пустую строку.

Что я должен делать? Изменить запрос (как?) или передать другой символ (символы), когда пользователь оставил пустой ввод?

Спасибо.

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


person zgorawski    schedule 13.10.2010    source источник
comment
Я надеюсь, что вы используете параметризованные запросы, так как ваш код вполне может быть открыт для SQL-инъекций. См. собственные таблицы.   -  person Oded    schedule 13.10.2010
comment
Откуда параметр? (@Oded: Я думаю, это то, что должно было означать '<parameter>'…)   -  person Tomalak    schedule 13.10.2010
comment
@Tomalak - надеюсь, ты прав...   -  person Oded    schedule 13.10.2010


Ответы (10)


Вы можете использовать coalesce для обработки null как пустой строки:

where COALESCE([table].[column],'') like '<parameter>'

В SQL Server вы также можете использовать IsNull:

where IsNull([table].[column],'') like '<parameter>'
person Andomar    schedule 13.10.2010
comment
Как насчет случая, когда индекс определен для [таблица].[столбец]? - person bjnr; 14.02.2014
comment
В оракуле (по крайней мере, версия 10.2, которую я использую) объединение не работает с пустой строкой. Я должен использовать COALESCE([table].[column],' ') для сопоставления полей. - person Teleporting Goat; 11.09.2019

isnull([table].[column], '') like '%'

Работает как шарм

person Pedro Rodrigues    schedule 27.07.2015

Я думаю, что это может сработать:

Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
person bernhardrusch    schedule 13.10.2010

Ну, как насчет

SELECT 
  * 
FROM 
  [table] 
WHERE
  ([table].[column] like <parameter>) OR 
  (<parameter> = '%')

... так что, когда вы передаете «%», вы получаете все строки обратно, иначе он работает так, как у вас есть на данный момент.

person Matt Gibson    schedule 13.10.2010

как насчет..

Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'

Таким образом, это примет ваше фактическое значение столбца или, если это пустая строка, и сравнит ее с вашим параметром, предполагая, что вы используете сервер ms sql.

person Shawson    schedule 13.10.2010

Сделайте два заявления! Если пользователь не передал параметр user:

Select * From [table] Where [table].[column] like '%' or [table].[column] is null;
person Tim    schedule 13.10.2010
comment
Удивительно, но NULL != NULL нужно использовать специальный оператор IS NULL - person Piskvor left the building; 13.10.2010
comment
Разве это не то же самое, что и select * from [table]? - person Caramiriel; 06.10.2015
comment
Да, но обычно у вас будет больше полей where, и % может быть параметром, предоставляемым PHP, например - person Berry M.; 02.10.2016

На основе Index in Where Clause Проблема с Этот подход

where COALESCE([table].[column],'') like '<parameter>'

Is :

Если вы использовали индекс в своем [столбце] из-за функции COALESCE, SQL Server не может использовать ваш индекс, это означает, что вы потратили свой индекс впустую.

А ТАКЖЕ

Проблема с этим подходом

Where [table].[column] like '%' or [table].[column] is null

Is :

Если [table].[column] имеет значение null, тогда код будет таким:

Where null like '%' or [table].[column] is null

и независимо от второй части предложения Where ([table].[column] равно null), результатом оценки будет UNKNOWN, и SQL Server отфильтрует эту запись.

NULL ИЛИ True = НЕИЗВЕСТНО

NULL OR False = НЕИЗВЕСТНО

Итак, это оптимизированный и нулевой подход:

Select * From [table] 
 WHERE 
      CASE 
          WHEN [table].[column] IS NULL THEN 1 
          WHEN [table].[column] like '<parameter>' THEN 1 
          ELSE 0 
      END   =  1
person HaMEd    schedule 06.10.2015
comment
Этот ответ - просто кусок кода, он очень похож на другой ответ. Пожалуйста, объясните, почему это хороший ответ, как работает код и чем он отличается от других ответов. - person AdrianHHH; 06.10.2015

Добрый день, используйте это решение, я думаю, что это смесь решений:

@parameter nvarchar (30)

if @parameter = ''
      Begin
          Set @parameter = '%'
      End

select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%'

Если вы просто хотите начать с параметра, удалите первый «%» и знак «плюс».

Я надеюсь, что вы найдете это полезным

person Neftali Rios    schedule 16.12.2015

Я хотел что-то подобное, чтобы на самом деле иметь возможность находить '%' (все), включая null или конкретное значение при вводе.

Для Oracle isnull не работает, а в моем случае COALESCE тоже.

Я использовал эту опцию в предложении where:

where decode(table1.field1,null,' ',table1.field1) like '%'

Надеюсь, это работает для других.

person nathie    schedule 15.07.2016
comment
coalesce работает на Oracle. Ваш код эквивалентен where coalesce(table1.field, ' ') like '%' - person trincot; 15.07.2016

Для SQLITE

SELECT * FROM [table] WHERE IFNULL([table].[column],'') like '<parameter>'
person ndw    schedule 14.08.2019