[英]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
使用时不同。
不管使用IF
, CASE
还是page_type == 1 and (...)
性能大致相同。 并且每个都将提供期望的结果(修复了我指出的错误之后)。 而且每个都会很慢-也就是说,每个都会进行全表扫描。 这有两个原因:
LIKE '%...'
)的优化效果不佳。 OR
优化效果不佳。 (并且仅当您除去所有ORs
和前导通配符时,更改为UNION
才有用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.