Mysql 使用';如果';在';选择';在';其中';SQL查询中的子句

Mysql 使用';如果';在';选择';在';其中';SQL查询中的子句,mysql,sql,Mysql,Sql,我们有以下疑问: SELECT foo_id, IF (( SELECT COUNT(foo_mapping_id) FROM foo_bar_mappings, bar WHERE foo_mapping_foo_id = foo_id AND foo_mapping_bar_id = bar_id ) >

我们有以下疑问:

SELECT
        foo_id,
        IF (( SELECT
            COUNT(foo_mapping_id) 
        FROM
            foo_bar_mappings,
            bar
        WHERE
            foo_mapping_foo_id = foo_id
            AND foo_mapping_bar_id = bar_id ) > 0,
        foo_status,
        'inactive') AS foo_status
    FROM
        foo
    WHERE
        foo_status = 'inactive'
当我们运行它时,我们会得到一个空结果,因为
foo_status
不等于
inactive
(而有些行满足
IF
foo_status
是存在于
foo
表中的一列,但我们希望“覆盖”它


我们如何更改此查询,以便使用我们的
WHERE
子句中的
IF
返回的
foo\u status
?显然,此查询已被简化,以使问题更容易询问和理解。

您不能在
where
子句中使用列别名。MySQL扩展了HAVING子句,因此可以使用它:

having foo_status = 'inactive'
注:

我将把查询写为:

SELECT f.foo_id,
       (CASE WHEN (EXISTS (SELECT 1
                           FROM foo_bar_mappings fb JOIN
                                bar b
                                ON fb.foo_mapping_bar_id = b.bar_id
                           WHERE fb.foo_mapping_foo_id = f.foo_id
                          ) 
             THEN foo_status
             ELSE 'inactive'
         END) AS new_foo_status
FROM foo f
HAVING new_foo_status = 'inactive';
注:

  • 在这种情况下,
    EXISTS
    COUNT(*)
    更有效
  • 我更喜欢
    CASE
    而不是
    IF()
    ,因为前者是ANSI标准
  • 我不喜欢使用与实际列同名的列别名。使用别名时,这可能会造成混淆

正如其他答案中所建议的,您可以在
HAVING
子句中使用列别名,但我发现您在发布的查询中没有
分组依据。在这种情况下,可以在外部查询中使用别名列,如

SELECT * FROM (
SELECT
        foo_id,
        IF (( SELECT
            COUNT(foo_mapping_id) 
        FROM
            foo_bar_mappings,
            bar
        WHERE
            foo_mapping_foo_id = foo_id
            AND foo_mapping_bar_id = bar_id ) > 0,
        foo_status,
        'inactive') AS foo_status
    FROM
        foo ) xxx
    WHERE
        foo_status = 'inactive'

但是
没有任何
分组依据
。这有意义吗?@Rahul。由于这个扩展,它在MySQL中不起作用。我认为这个扩展的存在是因为MySQL实现了子查询(其他数据库不一定这样做),所以这是一种不用子查询进行过滤的方法。谢谢