我有一个包含两列的表格:
['__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
?
答案 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);