繁体   English   中英

mysql查询的where子句中的if条件动态生成

[英]if condition in where clause of mysql query generating dynamically

嗨,我正在尝试用if在where子句中写一个查询,请提出我该如何处理我的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/*%'` )

现“完整查询”为

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/*%'` 
             )

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

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

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

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

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

您可以通过改写为并集而不是在where条件中使用或来优化它。

您可以为此使用案例。 案例陈述的工作是这样的。

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)

您有一个或两个其他答案无法解决的错误...

   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使用时不同。

不管使用IFCASE还是page_type == 1 and (...)性能大致相同。 并且每个都将提供期望的结果(修复了我指出的错误之后)。 而且每个都会很慢-也就是说,每个都会进行全表扫描。 这有两个原因:

  • 前导通配符(如LIKE '%...' )的优化效果不佳。
  • OR优化效果不佳。 (并且仅当您除去所有ORs 前导通配符时,更改为UNION才有用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM