Например, "%" не принимает значение NULL
У меня есть запрос, который создается из пользовательских входов (передается через html-форму). Это выглядит (простой пример):
Select * From [table] Where [table].[column] like '<parameter>'
Этот параметр может быть необязательным, поэтому, если пользователь оставил соответствующее поле ввода пустым, я передаю %. Он работал нормально, пока не столкнулся с значениями NULL. Я понимаю, что символы соответствия "%" не равны нулю, но я хотел бы рассматривать NULL как пустую строку в этом случае.
Что мне делать? Изменить запрос (как?) Или передать другой символ (символы), когда пользователь оставил пустой ввод?
Спасибо.
PS. Это реальная проблема из существующей системы, и я знаю ее далеко не оптимальное решение, но мне приходится иметь дело с ней.
Ответы
Ответ 1
Вы можете использовать coalesce
для обработки нулевого значения, как пустая строка:
where COALESCE([table].[column],'') like '<parameter>'
В SQL Server вы также можете использовать IsNull
:
where IsNull([table].[column],'') like '<parameter>'
Ответ 2
isnull([table].[column], '') like '%'
работает как шарм
Ответ 3
Я думаю, это может сработать:
Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
Ответ 4
Ну, как насчет
SELECT
*
FROM
[table]
WHERE
([table].[column] like <parameter>) OR
(<parameter> = '%')
... так что, когда вы передаете "%", вы возвращаете все строки, в противном случае он работает так же, как и в данный момент.
Ответ 5
Сделайте два утверждения! Если пользователь не прошел ни одного параметра пользователя:
Select * From [table] Where [table].[column] like '%' or [table].[column] is null;
Ответ 6
как насчет..
Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'
Таким образом, это займет ваше фактическое значение столбца, или если это null пустая строка и сравните ее, аганируйте свой параметр, предполагая, что вы используете ms sql server..
Ответ 7
Основано на Указатель в разделе Where > Проблема с этим подходом
where COALESCE([table].[column],'') like '<parameter>'
Есть:
Если вы использовали индекс в своем [столбце], из-за функции COALESCE, SQL Server не может использовать ваш индекс, это означает, что вы потеряли свой индекс
И
Проблема с этим подходом
Where [table].[column] like '%' or [table].[column] is null
Есть:
Если [table]. [column] имеет значение null, тогда код будет выглядеть следующим образом:
Where null like '%' or [table].[column] is null
и независимо от второй части предложения Where ([table]. [column] имеет значение null)
результатом оценки будет UNKNOWN и фильтр SQL Server, который записывается.
NULL ИЛИ True = UNKNOWN
NULL ИЛИ False = UNKNOWN
Итак, это оптимизированный и нулевой подход:
Select * From [table]
WHERE
CASE
WHEN [table].[column] IS NULL THEN 1
WHEN [table].[column] like '<parameter>' THEN 1
ELSE 0
END = 1
Ответ 8
Добрый день, используйте это решение, я думаю, что это смесь решений:
@parameter nvarchar (30)
if @parameter = ''
Begin
Set @parameter = '%'
End
select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%'
Если вы просто хотите начать с параметра, удалите первый символ "%" и "плюс"
Надеюсь, вы сочтете это полезным.
Ответ 9
Мне нужно что-то похожее, чтобы действительно найти "%" (все), включая нуль или определенное значение при вводе.
Для Oracle isnull
не работает и в моем случае COALESCE
.
Я использовал эту опцию в предложении where:
where decode(table1.field1,null,' ',table1.field1) like '%'
Надеюсь, что это сработает для других.
Ответ 10
Для SQLITE
SELECT * FROM [table] WHERE IFNULL([table].[column],'') like '<parameter>'