SQL - выбрать все, когда значение фильтра пусто - PullRequest
4 голосов
/ 16 марта 2010

В моем веб-приложении ASP.net есть запрос SQL, который выглядит следующим образом:

SELECT * FROM [Records] WHERE ([title] LIKE '%' + @title + '%')

@ title, конечно же, значение текстового поля на странице.

Мой вопрос: почему, когда текстовое поле пусто, это ничего не возвращает? И как я могу заставить его вернуть все, как логика подсказывает мне?

Ответы [ 6 ]

5 голосов
/ 16 марта 2010
SELECT * FROM [Records] 
WHERE @title IS NULL OR LEN(@Title) = 0 OR ([title] LIKE '%' + @title + '%') 
2 голосов
/ 16 марта 2010

Наиболее приемлемый вариант, за исключением использования динамического SQL, заключается в использовании оператора IF и двух запросов:

IF LEN(@Title) > 0

  SELECT r.*
    FROM RECORDS r
   WHERE r.title LIKE '%'+ @Title +'%'

ELSE

  SELECT r.*
    FROM RECORDS r

Версия динамического SQL SQL Server 2005+ будет выглядеть следующим образом:

DECLARE @SQL NVARCHAR(4000)
   SET @SQL = 'SELECT r.*
                 FROM RECORDS r 
                WHERE 1 = 1' --will be optimized out, easier to add clauses

   SET @SQL = @SQL + CASE LEN(@Title)
                       WHEN 0 THEN ''
                       ELSE ' AND r.name LIKE ''%''+ @Title +''%'' '   
                     END

BEGIN

  EXEC sp_executesql @SQL, N'@Title VARCHAR(#)', @Title

END

В отличие от EXEC, sp_executesql будет кэшировать план запроса. Вы можете прочитать больше об этом в Благословение и проклятие динамического SQL .

0 голосов
/ 16 марта 2010

NULL плюс все равно NULL, поэтому, хотя вы можете ожидать получения «%%», вы на самом деле получаете NULL. Поскольку ничто не похоже на NULL (вместо этого все равно NULL), вы ничего не получите. Вы можете попробовать что-то вроде WHERE [TITLE] LIKE ISNULL ('%' + @title + '%', '%'); Если первый аргумент ISNULL равен NULL, он возвращает второй аргумент.

0 голосов
/ 16 марта 2010

Используйте

SELECT * FROM [Records] WHERE (isnull(@title,'') = '' or [title] LIKE '%' + @title + '%') 

Или выполните проверку на наличие пустого заголовка в клиентском коде, передайте NULL, если это так, и выполните условие: "@title is null or ...".

0 голосов
/ 16 марта 2010

Я не совсем уверен, но, возможно, это происходит, когда @title равно NULL. Операции на NULL обычно возвращают NULL, так что вы будете сравнивать с NULL.

0 голосов
/ 16 марта 2010

Возможно ли, что значение @title содержит ноль или один пробел?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...