2010-03-16 2 views
4

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

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

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

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

+0

положить точку останова и проверить фактический запрос, который отправляется в базу данных ... –

ответ

5
SELECT * FROM [Records] 
WHERE @title IS NULL OR LEN(@Title) = 0 OR ([title] LIKE '%' + @title + '%') 
+0

@ Джон Сандерс: Если это SQL Server, то вы должны использовать 'RTRIM (LTRIM (@Title))' - нет TRIM() в TSQL :( –

+0

@Mitch: возможно, LEN (RTRIM (LTRIM (@Title))) @OMG: сделал «редактирование последнего человека». –

+0

ОК, это работает, когда я запрашиваю базу данных вручную, но для некоторых причина, по которой он не работает с веб-формой ... На мой взгляд, это отдельный вопрос. – ian93

0

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

0

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

0

Использование

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

Или чек на пустой титул в коде клиента, передать NULL, если это так, и сделать условие: «@title является нулевым или ...».

0

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

2

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

IF LEN(@Title) > 0 

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

ELSE 

    SELECT r.* 
    FROM RECORDS r 

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

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 кэширует план запроса. Вы можете узнать больше об этом в the Blessing & Curse of Dynamic SQL.

Смежные вопросы