如何将 if 条件放在 where 子句中
Posted
技术标签:
【中文标题】如何将 if 条件放在 where 子句中【英文标题】:how can put if condition in where clause 【发布时间】:2018-11-16 07:56:19 【问题描述】:请不要与问题IF clause within WHERE clause 重复? 我认为我的问题是不同的,我已经尝试过,但在以下条件下我不能不成功。
如何将if条件放在sql中的where之间 例如
SELECT *
FROM LocationOutsw W
WHERE if(@p_type = 'ALL') then
(W.NAME LIKE '%'+ @p_search + '%' OR W.DESCRIPTION LIKE '%'+ @p_search + '%')
if(@p_type == "NAME")
W.NAME LIKE '%'+ @p_search + '%'
if(@p_type == "DESCRIPTION ")
W.DESCRIPTION LIKE '%'+ @p_search + '%')
【问题讨论】:
您使用的是 mysql、MS SQL Server 还是 Oracle?该查询将在其中一个上运行。 【参考方案1】:SELECT *
FROM LocationOutsw W
WHERE ( @p_type = 'ALL'
AND ( W.NAME LIKE '%'+ @p_search + '%'
OR W.DESCRIPTION LIKE '%'+ @p_search + '%'
)
)
OR ( @p_type = 'NAME'
AND W.NAME LIKE '%'+ @p_search + '%'
)
OR ( @p_type = 'DESCRIPTION'
AND W.DESCRIPTION LIKE '%'+ @p_search + '%'
)
但我强烈建议不要这样编写查询,因为您会得到错误的查询计划。
【讨论】:
【参考方案2】:我会为此使用布尔表达式
SELECT *
FROM LocationOutsw W
WHERE (@p_type = 'ALL' and W.NAME LIKE '%'+ @p_search + '%' OR W.DESCRIPTION LIKE '%'+ @p_search + '%')
or (@p_type = 'NAME' and W.NAME LIKE '%'+ @p_search + '%')
or (@p_type = 'DESCRIPTION' and W.DESCRIPTION LIKE '%'+ @p_search + '%')
注意语法。撇号与引号的含义不同。
【讨论】:
【参考方案3】:我会推荐这种方式..它会做得更好..
SELECT
*
FROM
LocationOutsw W
WHERE
(@p_type = 'ALL' AND
(W.NAME LIKE '%'+ @p_search + '%' OR W.DESCRIPTION LIKE '%'+ @p_search + '%'))
OR
(@p_type = 'NAME' AND W.NAME LIKE '%'+ @p_search + '%')
OR
(@p_type = 'DESCRIPTION' AND W.DESCRIPTION LIKE '%'+ @p_search + '%')
而'
字符串的单引号不是"
双引号..
【讨论】:
以上是关于如何将 if 条件放在 where 子句中的主要内容,如果未能解决你的问题,请参考以下文章