如果条件在mysql查询的where子句中动态生成

时间:2015-10-02 05:20:47

标签: mysql

您好我正在尝试使用if子句编写查询 请建议我怎么做我的情况如下

 IF(`page_type` ==1,
    `pages NOT LIKE '%ads/indian-institute-of-technology-bombay.html%' 
  OR pages NOT LIKE '%ads/*%' OR pages NOT LIKE '%indian-institute-of-technology-bombay.html/*%'` ,
   ` pages LIKE '%ads/indian-institute-of-technology-bombay.html%'
  OR pages LIKE '%ads/*%' OR
     pages LIKE '%indian-institute-of-technology-bombay.html/*%'` )

完整查询

SELECT  *
    FROM  `app_slides`
    WHERE  IF(`page_type` ==1, `pages NOT LIKE '%ads/indian-institute-of-technology-bombay.html%'
              OR  pages NOT LIKE '%ads/*%'
              OR  pages NOT LIKE '%indian-institute-of-technology-bombay.html/*%'` ,
                ` pages LIKE '%ads/indian-institute-of-technology-bombay.html%'
              OR  pages LIKE '%ads/*%'
              OR  pages LIKE '%indian-institute-of-technology-bombay.html/*%'` 
             )

4 个答案:

答案 0 :(得分:0)

IF的工作原理如下:

IF(<condition>, <value if true>, <value if false>)

以此为例

SELECT IF( 'a' = 'a', 1, 0 ); //will return 1
SELECT IF( 'a' = 'b', 1, 0 );//will return 0

IF查询中使用WHERE 以下示例显示了如何使用IF in a WHERE查询。

SELECT ...
WHERE ...
AND IF(myfield = 'somevalue', 1, 0) = 1

答案 1 :(得分:0)

这不应该在if中完成,而应该使用逻辑运算符表示。

select ... from ... where (`page_type` == 1 and ... )
or (`page_type` <>1 and ...)

您可以通过重写为联合而不是使用或在where标准中来优化它。

答案 2 :(得分:0)

您可以使用案例。案例陈述就是这样的。

SELECT empno, ename, job
  FROM scott.emp
 WHERE (CASE WHEN job = 'MANAGER' THEN '1'  
         WHEN job = 'CLERK'   THEN '2' 
         ELSE '0'  END) IN (1, 2)

答案 3 :(得分:0)

你有一两个错误,其他答案没有解决......

   x NOT LIKE 'a'
OR x NOT LIKE 'b'

始终为TRUE。因此,IF的第一部分将永远成功。也许你想要

NOT (   x LIKE 'a'
     OR x LIKE 'b' )

具体地,

NOT (   `pages LIKE '%ads/indian-institute-of-technology-bombay.html%' 
      OR pages LIKE '%ads/*%'
      OR pages LIKE '%indian-institute-of-technology-bombay.html/*%'` )

另一个可能的错误:

ads/*

这实际上是你期待的吗?请注意*LIKE中使用时与RLIKE中使用的IF不同。

使用CASEpage_type == 1 and (...)还是LIKE '%...'并不重要 - 每个都会​​大致相同。并且每个人都会得到所需的结果(在修复我指出的错误之后)。每个都会很慢 - 也就是说,每个人都会进行全表扫描。这有两个原因:

  • 领先的外卡(OR)效果不佳。
  • UNION效果不佳。 (只有当你摆脱所有ORs 前导通配符时,更改为{{1}}才有用。