[英]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';
筆記:
EXISTS
比COUNT(*)
更有效。 CASE
到IF()
因為前者是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.