MySQL Case语句 - Where子句中的未知列

8

我在查询中遇到了问题,出了什么错吗?

SELECT 
    CASE 
        WHEN cp_pessoa.score < 100 THEN 1 
        WHEN cp_pessoa.score < 300 THEN 2 
        WHEN cp_pessoa.score >= 300 THEN 3 
    END as id_ranking
FROM cp_pessoa 
    WHERE id_ranking IN (1,2);

我遇到了这个错误:#1054 - 在 'where clause' 中未知的列'id_ranking'
谢谢!

哪里看不到别名。 - Mihai
3个回答

6

这是因为SELECT语句准备好结果后(作为id_ranking),才会调用WHERE语句。

SELECT 
    CASE 
    WHEN cp_pessoa.score < 100 THEN 1 
    WHEN cp_pessoa.score < 300 THEN 2 
    WHEN cp_pessoa.score >= 300 THEN 3 
END as id_ranking
FROM cp_pessoa 
WHERE cp_pessoa.score < 300;

这是它的工作原理(顺序):
  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

有没有其他解决方法?"id_ranking(1,2)" 这一段是变量。 - Wilker Iceri
这是一个不错的标准方法,但你可以用许多其他方法得到同样的结果。例如,在WHERE子句中复制你的CASE语句,或者选择插入到另一个表中,然后使用当前的子句(2个查询)。但你真的需要这样吗? - BaBL86

5

where中不允许使用别名。将查询更改为以下形式之一:

SELECT * FROM 
(
SELECT 
    CASE 
        WHEN cp_pessoa.score < 100 THEN 1 
        WHEN cp_pessoa.score < 300 THEN 2 
        WHEN cp_pessoa.score >= 300 THEN 3 
    END as id_ranking
FROM cp_pessoa 
)a 
WHERE id_ranking IN (1,2)

或者

SELECT 
    CASE 
        WHEN cp_pessoa.score < 100 THEN 1 
        WHEN cp_pessoa.score < 300 THEN 2 
        WHEN cp_pessoa.score >= 300 THEN 3 
    END as id_ranking
FROM cp_pessoa 
WHERE 
  CASE 
        WHEN cp_pessoa.score < 100 THEN 1 
        WHEN cp_pessoa.score < 300 THEN 2 
        WHEN cp_pessoa.score >= 300 THEN 3 
    END IN (1,2)

你的WHERE语句在任何地方都有效,因为1、2和3始终<300。 - BaBL86
@BaBL86:已修复,为真。 - a1ex07

1

您不能在 where 子句中使用别名,而应该尝试

SELECT 
CASE 
    WHEN cp_pessoa.score < 100 THEN 1 
    WHEN cp_pessoa.score < 300 THEN 2 
    WHEN cp_pessoa.score >= 300 THEN 3 
END as id_ranking
FROM cp_pessoa 
WHERE cp_pessoa.score < 300

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接