【问题标题】:MySQL CASE WHEN where clause causes failureMySQL CASE WHEN where 子句导致失败
【发布时间】: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 子句 - 检查 stackoverflow.com/questions/200200/…
  • 是的,您是对的-当您知道如何操作时,这很容易-更改为 HAVING rank > 0 并且工作正常。添加为答案,我将标记为正确 - 谢谢。

标签: mysql sql select case where-clause


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多