我的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 + '%')
答案 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)
我不太确定,但是当@title
为NULL
时,可能会发生这种情况。 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,则返回第二个参数。