Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: zgorawskiОтветов: 10

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

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

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

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

Спасибо.

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

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

nullsql

Ответы

Ответ 1 · рейтинг 64 · Andomar

Вы можете использовать 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;

Ответ 7 · рейтинг 1 · HaMEd

На основе 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

Ответ 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>'

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы