简体   繁体   English

MySQL Left Join,如果为null,则从一个或另一个中选择一个字段

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

I am trying to LEFT JOIN 2 tables. 我试图LEFT JOIN 2表。 which is working out fine. 这很好。 But i am getting back two sets of fields named setting_value . 但我回来了两组名为setting_value的字段。 iam trying to get tblSettings . 我试图获得tblSettings setting_value only if tblAgencySettings . 仅在tblAgencySettings setting_value setting_value is NULL. setting_value为NULL。 How would i go about doing this? 我该怎么做呢? I know i can rename the fields, then in PHP i can check the tblAgencySettings . 我知道我可以重命名字段,然后在PHP中我可以检查tblAgencySettings setting_value and if NULL then grab the tblSettings . setting_value如果为NULL则抓住tblSettings setting_value but i prefer to keep this at MySQL. 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'

slight issue i just noticed. 我刚注意到的一个小问题。 i failed to mention this. 我没提到这个。 if tblAgencySettings.setting_value does have a value. 如果tblAgencySettings.setting_value确实有值。 but changeable is not 1 then just select tblSettings.setting_value 但是更改不是1然后只需选择tblSettings.setting_value

Just add a COALESCE : 只需添加一个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'

The COALESCE function returns the first non-NULL value you give it so this: COALESCE函数返回您给出的第一个非NULL值,所以:

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

Will be tblAgencySettings.setting_value if that's not NULL and tblSettings.setting_value if tblAgencySettings.setting_value is NULL. tblAgencySettings.setting_value如果这不是NULL和tblSettings.setting_value如果tblAgencySettings.setting_value为NULL。

If tblAgencySettings.setting_value can also be zero and you want to ignore that as well as NULL, then you could use this instead of the COALESCE above: 如果tblAgencySettings.setting_value也可以为零,并且您想要忽略它以及NULL,那么您可以使用它而不是上面的COALESCE:

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

The IF returns the second argument if the first is true and the third if the first argument is false so the above use converts zero to NULL. 如果第一个参数为真,则IF返回第二个参数,如果第一个参数为假,则返回第三个参数,因此上述使用将零转换为NULL。 Or, you could go all the way to a CASE statement: 或者,您可以一直到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    

Change your SQL Statement to this: 将您的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'

Here's a link to MYSQL CASE Statement for your reference. 这是MYSQL CASE Statement的链接供您参考。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM