【发布时间】:2023-04-09 22:22:01
【问题描述】:
有没有更好的方法来获取以下内容?
DECLARE @Desc VARCHAR(200) = ''
SELECT [id],
[Desc],
[Col1],
[Col2]
FROM [dbo].[tbl]
WHERE [Desc] LIKE CASE
WHEN @Desc LIKE ''
THEN [Desc]
ELSE '%'+ @Desc +'%'
END
这允许在参数未定义 (@Desc='') 或返回值的子集 (@Desc='test') 时返回所有值。
【问题讨论】:
-
如果你只传递一个空字符串或一个非空字符串(而不是 NULL),那么这不是做同样的事情:
WHERE [Desc] LIKE '%' + @Desc + '%';?即使您确实传递了 NULL,WHERE [Desc] LIKE '%' + COALESCE(@Desc, '') + '%'; -
相关,可能是duplicate。如果这是一个存储过程,并且
Better表示“更高性能”,那么最好使用动态 SQL(或自定义 SQL 的 ORM)并完全删除可选谓词,而是为分支运行不同的查询。原因?查询计划。 -
旁白:在
where子句中添加通配符 (%) 会阻止使用@Desc搜索以模式开头或结尾的字符串,例如'Mac%'。它也排除了使用索引查找,尽管索引 scan 仍然是可能的。 -
@HABO 一般来说,字符串末尾的通配符仍然允许使用索引。
'Mac%'会起作用,但 '%Mac' 不会。此外,您可以使用reverse值构建索引,以允许您查询'%Mac'。请参阅this question 进行一些讨论。
标签: sql sql-server tsql case sql-like