У меня есть запрос, созданный на основе ввода пользователя (передается через форму html). Это выглядит так (простой пример):
Select * From [table] Where [table].[column] like '<parameter>'
Этот параметр может быть необязательным, поэтому, если пользователь оставил соответствующее поле ввода пустым, я передаю %. Он работал нормально, пока я не столкнулся со значениями NULL. Я понимаю, что символы "%" не равны нулю, но в этом случае я хотел бы рассматривать NULL как пустую строку.
Что я должен делать? Изменить запрос (как?) или передать другой символ (символы), когда пользователь оставил пустой ввод?
Спасибо.
PS. Это реальная проблема существующей системы, и я знаю, что это далеко не оптимальное решение, но я должен с этим справиться.
Я надеюсь, что вы используете параметризованные запросы, так как ваш код вполне может быть открыт для SQL-инъекций. См. собственные таблицы. Oded 13.10.2010
Откуда параметр? (@Oded: Я думаю, это то, что должно было означать '<parameter>'...) Tomalak 13.10.2010
Вы можете использовать coalesce для обработки null как пустой строки:
where COALESCE([table].[column],'') like '<parameter>'
В SQL Server вы также можете использовать IsNull:
where IsNull([table].[column],'') like '<parameter>'
Ответ 2 · рейтинг 6 · Pedro Rodrigues
isnull([table].[column], '') like '%'
Работает как шарм
Ответ 3 · рейтинг 3 · bernhardrusch
Я думаю, что это может сработать:
Select * From [table] Where [table].[column] is null or [table].[column] like '<parameter>'
Ответ 4 · рейтинг 3 · Matt Gibson
Ну, как насчет
SELECT
*
FROM
[table]
WHERE
([table].[column] like <parameter>) OR
(<parameter> = '%')
... так что, когда вы передаете "%", вы получаете все строки обратно, иначе он работает так, как у вас есть на данный момент.
Ответ 5 · рейтинг 1 · Shawson
как насчет..
Select * From [table] Where ISNULL([table].[column], '') like '<parameter>'
Таким образом, это примет ваше фактическое значение столбца или, если это пустая строка, и сравнит ее с вашим параметром, предполагая, что вы используете сервер ms sql.
Ответ 6 · рейтинг 1 · Tim
Сделайте два заявления! Если пользователь не передал параметр user:
Select * From [table] Where [table].[column] like '%' or [table].[column] is null;
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
Ответ 8 · Neftali Rios
Добрый день, используйте это решение, я думаю, что это смесь решений:
@parameter nvarchar (30)
if @parameter = ''
Begin
Set @parameter = '%'
End
select * from [table] as t where ISNULL (t. [column], '') like '%' + @parameter + '%'
Если вы просто хотите начать с параметра, удалите первый "%" и знак "плюс".
Я надеюсь, что вы найдете это полезным
Ответ 9 · nathie
Я хотел что-то подобное, чтобы на самом деле иметь возможность находить '%' (все), включая null или конкретное значение при вводе.
Для Oracle isnull не работает, а в моем случае COALESCE тоже.
Я использовал эту опцию в предложении where:
where decode(table1.field1,null,' ',table1.field1) like '%'
Надеюсь, это работает для других.
Ответ 10 · ndw
Для SQLITE
SELECT * FROM [table] WHERE IFNULL([table].[column],'') like '<parameter>'