如何将 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 子句中的主要内容,如果未能解决你的问题,请参考以下文章

where条件放在子SQL语句中是否查询速度更快?

在 where 子句中使用 CASE

SQL Server If 条件在 where 子句?

如何有基于参数值的条件 where 子句

ms sql server中where子句中的if else条件

oracle中where子句和having子句中的区别