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 不会支持带有 aliases
的 WHERE
子句 - 检查 ***.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 子句导致失败的主要内容,如果未能解决你的问题,请参考以下文章