【问题标题】:MySQL Left Join, SELECT a field either from one or the other if nullMySQL左连接,如果为null,则从一个或另一个中选择一个字段
【发布时间】:2011-10-22 02:30:12
【问题描述】:

我正在尝试 LEFT JOIN 2 个表。效果很好。但我得到了两组名为setting_value 的字段。只有当tblAgencySettings.setting_value 为NULL 时,我才尝试获取tblSettings.setting_value。我该怎么做呢?我知道我可以重命名这些字段,然后在 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

【问题讨论】:

    标签: mysql select null left-join


    【解决方案1】:

    只需添加一个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`)
    

    如果不为 NULL,则为 tblAgencySettings.setting_value,如果 tblAgencySettings.setting_value 为 NULL,则为 tblSettings.setting_value

    如果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    
    

    【讨论】:

      【解决方案2】:

      将您的 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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-08
        • 2018-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-20
        相关资源
        最近更新 更多