簡體   English   中英

MySQL Left Join,如果為null,則從一個或另一個中選擇一個字段

[英]MySQL Left Join, SELECT a field either from one or the other if null

我試圖LEFT JOIN 2表。 這很好。 但我回來了兩組名為setting_value的字段。 我試圖獲得tblSettings 僅在tblAgencySettings setting_value setting_value為NULL。 我該怎么做呢? 我知道我可以重命名字段,然后在PHP中我可以檢查tblAgencySettings setting_value如果為NULL則抓住tblSettings setting_value但我更喜歡將它保留在MySQL。

SELECT `tblSettings`.`id`, `tblSettings`.`setting_name`,
       `tblSettings`.`setting_value`, `tblAgencySettings`.`setting_value`
FROM `tblSettings` LEFT JOIN `tblAgencySettings` 
ON `tblSettings`.`id` = `tblAgencySettings`.`setting_id`
AND `tblAgencySettings`.`agency_id` = '1'
WHERE `tblSettings`.`changeable` = '1'

我剛注意到的一個小問題。 我沒提到這個。 如果tblAgencySettings.setting_value確實有值。 但是更改不是1然后只需選擇tblSettings.setting_value

只需添加一個COALESCE

SELECT `tblSettings`.`id`, `tblSettings`.`setting_name`,
       COALESCE(`tblAgencySettings`.`setting_value`, `tblSettings`.`setting_value`)
FROM `tblSettings` LEFT JOIN `tblAgencySettings` 
ON `tblSettings`.`id` = `tblAgencySettings`.`setting_id`
AND `tblAgencySettings`.`agency_id` = '1'
WHERE `tblSettings`.`changeable` = '1'

COALESCE函數返回您給出的第一個非NULL值,所以:

COALESCE(`tblAgencySettings`.`setting_value`, `tblSettings`.`setting_value`)

tblAgencySettings.setting_value如果這不是NULL和tblSettings.setting_value如果tblAgencySettings.setting_value為NULL。

如果tblAgencySettings.setting_value也可以為零,並且您想要忽略它以及NULL,那么您可以使用它而不是上面的COALESCE:

COALESCE(
    IF(`tblAgencySettings`.`setting_value` = 0, NULL, `tblAgencySettings`.`setting_value`),
   `tblSettings`.`setting_value`
)

如果第一個參數為真,則IF返回第二個參數,如果第一個參數為假,則返回第三個參數,因此上述使用將零轉換為NULL。 或者,您可以一直到CASE聲明:

case
    when `tblAgencySettings`.`setting_value` = 0     then `tblSettings`.`setting_value`
    when `tblAgencySettings`.`setting_value` IS NULL then `tblSettings`.`setting_value`
    else `tblSettings`.`setting_value`
end    

將您的SQL語句更改為:

SELECT `tblSettings`.`id`, `tblSettings`.`setting_name`, 
   CASE WHEN `tblSettings`.`setting_value` IS NULL THEN `tblAgencySettings`.`setting_value` 
    ELSE `tblSettings`.`setting_value` END AS `setting_value` 
    FROM `tblSettings` LEFT JOIN `tblAgencySettings` 
    ON `tblSettings`.`id` = `tblAgencySettings`.`setting_id`
    AND `tblAgencySettings`.`agency_id` = '1'
    WHERE `tblSettings`.`changeable` = '1'

這是MYSQL CASE Statement的鏈接供您參考。

暫無
暫無

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

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