MySQL CASE WHEN where 子句导致失败

Posted

技术标签:

【中文标题】MySQL CASE WHEN where 子句导致失败【英文标题】:MySQL CASE WHEN where clause causes failure 【发布时间】:2016-03-30 18:59:25 【问题描述】:

我有一个复杂的查询,它跨多个列进行多次匹配,然后按相关性排序。

一切正常,直到我添加WHERE 'rank' > 0

然后返回一个空的结果集。

如果我删除“WHERE”语句,那么我可以在顶部看到所有匹配最高的结果。

有人可以帮我解决“在哪里”吗:-D 我错了!!

SELECT *, CASE WHEN companyName = 'gfdgfs' THEN 2 ELSE 0 END 
+ CASE WHEN companyName LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
+ CASE WHEN companyName = 'potato' THEN 2 ELSE 0 END 
+ CASE WHEN companyName LIKE '%potato%' THEN 1 ELSE 0 END 
+ CASE WHEN address1 = 'gfdgfs' THEN 2 ELSE 0 END 
+ CASE WHEN address1 LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
+ CASE WHEN address1 = 'potato' THEN 2 ELSE 0 END 
+ CASE WHEN address1 LIKE '%potato%' THEN 1 ELSE 0 END 
AS rank 
FROM clients 
WHERE rank > 0
ORDER BY rank

编辑

我删除了 rank 单词周围的单引号,现在得到“where 子句中的未知列排名”

【问题讨论】:

Rank这两个地方的单引号去掉试试 Unknown Column rank in WHERE Clause 如果我这样做,那么至少这是一些问题 - 我掩盖了问题 - 但我该如何解决这个问题? :-P 我认为 mysql 不会支持带有 aliasesWHERE 子句 - 检查 ***.com/questions/200200/… 是的,您是对的-当您知道如何操作时,这很容易-更改为 HAVING rank > 0 并且工作正常。添加为答案,我将标记为正确 - 谢谢。 【参考方案1】:

试试这个:

SELECT * 
FROM (SELECT *, CASE WHEN companyName = 'gfdgfs' THEN 2 ELSE 0 END 
              + CASE WHEN companyName LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
              + CASE WHEN companyName = 'potato' THEN 2 ELSE 0 END 
              + CASE WHEN companyName LIKE '%potato%' THEN 1 ELSE 0 END 
              + CASE WHEN address1 = 'gfdgfs' THEN 2 ELSE 0 END 
              + CASE WHEN address1 LIKE '%gfdgfs%' THEN 1 ELSE 0 END 
              + CASE WHEN address1 = 'potato' THEN 2 ELSE 0 END 
              + CASE WHEN address1 LIKE '%potato%' THEN 1 ELSE 0 END 
              AS rank 
        FROM clients 
      ) AS A 
WHERE rank > 0
ORDER BY rank;

【讨论】:

no 不起作用 - musiclovingindiangirl 说得对,因为 WHERE 不适用于别名。需要改用HAVING。不过还是谢谢。【参考方案2】:

rank 中删除单引号并尝试。无论如何,我认为 MySQL 不会支持带有别名的 WHERE 子句 - 检查 this。

使用HAVING 而不是WHERE

SELECT *, CASE WHEN companyName = 'gfdgfs' THEN 2 ELSE 0 END + CASE WHEN companyName LIKE '%gfdgfs%' THEN 1 ELSE 0 END + CASE WHEN companyName = 'potato' THEN 2 ELSE 0 END + CASE WHEN companyName LIKE '%potato%' THEN 1 ELSE 0 END + CASE WHEN address1 = 'gfdgfs' THEN 2 ELSE 0 END + CASE WHEN address1 LIKE '%gfdgfs%' THEN 1 ELSE 0 END + CASE WHEN address1 = 'potato' THEN 2 ELSE 0 END + CASE WHEN address1 LIKE '%potato%' THEN 1 ELSE 0 END AS rank FROM clients HAVING rank > 0 ORDER BY rank

【讨论】:

以上是关于MySQL CASE WHEN where 子句导致失败的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 的 WHERE 子句中的 CASE 或 COALESCE 性能

MySQL 条件, case when 和 if 方法

mysql case when 碰上中文字符串

mysql 查询某个字段并拼接case when出来的字段

where 中使用 case when 无法使用索引

mysql 中 case when then .... else end 的简单使用