簡體   English   中英

在SQL查詢的'WHERE'子句中的'SELECT'中使用'IF'的結果

[英]Use result of 'IF' in 'SELECT' in 'WHERE' clause in SQL query

我們有以下查詢:

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_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';

筆記:

  • 在這種情況下, EXISTSCOUNT(*)更有效。
  • 我更喜歡CASEIF()因為前者是ANSI標准。
  • 使用與真實列同名的列別名我感到很不舒服。 使用別名時,這可能會造成混淆。

正如在其他答案中已經建議的那樣,您可以在HAVING子句中使用列別名,但我發現您在發布的查詢中沒有GROUP BY 在這種情況下,您可以在外部查詢中使用別名列

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM