在mySQL中的WHERE子句中使用if / else结果别名

时间:2016-03-23 11:43:17

标签: mysql

我有一个包含两列的表格:

['__doc__', '__module__', 'a', 'c'] a c foo <__main__.C instance at 0x024CB9B8> ['__doc__', '__module__', 'a', 'c', 'f'] user_id

我想运行以下查询:

parent_id

但它不起作用 - 它说无法找到id列。如何在SELECT (CASE WHEN parent_id IS NOT NULL THEN parent_id ELSE user_id END) as id FROM users WHERE id in (43, 23, 11, 277); 子句中使用alias

3 个答案:

答案 0 :(得分:2)

coalesce就是为此而做的。它返回第一个非NULL值。

SELECT coalesce(parent_id, user_id) as id
FROM users
WHERE coalesce(parent_id, user_id) in (43, 23, 11, 277);

由于你不能在where子句中使用别名 - 你必须使用它两次。

  

不允许在WHERE子句中引用列别名,因为在执行WHERE子句时可能尚未确定列值。

答案 1 :(得分:1)

正如您所注意到的,SELECT中定义的列别名无法在WHERE中使用。您可以重复表达式或使用子查询。 MySQL还提供了另一种解决方案:MySQL扩展了HAVING子句的使用,因此可以在这种情况下使用:

SELECT COALESCE(parent_id, user_id) as id
FROM users
HAVING id in (43, 23, 11, 277);

这在其他数据库中不起作用。它在MySQL中非常方便,特别是当你在SELECT中有复杂的表达式时。 (在其他数据库中,您将使用子查询或CTE而不会降低性能)。

答案 2 :(得分:0)

在where子句中我们无法创建别名,因此您可以在条件

中使用列名
SELECT IFNULL(parent_id, user_id) as id
FROM users
WHERE IFNULL(parent_id, user_id) IN (43, 23, 11, 277);