SQL - 当过滤器值为空时选择全部

时间:2010-03-16 01:27:26

标签: sql sql-server tsql

我的ASP.net网络应用程序中有一个SQL查询,如下所示:

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

@title当然是页面上文本框的值。

我的问题是,为什么,当文本框为空时,它什么都不返回?我怎么能让它归还所有东西,就像逻辑告诉我应该的那样?

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

除了使用动态SQL之外,最可靠的选项是使用IF语句和两个查询:

IF LEN(@Title) > 0

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

ELSE

  SELECT r.*
    FROM RECORDS r

SQL Server 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中了解有关它的更多信息。

答案 2 :(得分:0)

@title的值是否可能保持null或单个空格?

答案 3 :(得分:0)

我不太确定,但是当@titleNULL时,可能会发生这种情况。 NULL上的操作通常会返回NULL,因此您需要与NULL进行比较。

答案 4 :(得分:0)

使用

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

或者在客户端代码中检查空标题,如果是,则传递NULL,并执行条件:“@title为null或...”。

答案 5 :(得分:0)

NULL加上任何东西都是NULL,所以当你可能期望获得'%%'时,你实际上是NULL。因为没有什么是LIKE NULL(事情是空的,而不是),你什么也得不到。您可以尝试类似WHERE [TITLE] LIKE ISNULL('%'+ @title +'%','%'); 如果ISNULL的第一个参数为NULL,则返回第二个参数。