SQL函数COALESCE()如何工作?

时间:2018-08-06 03:28:00

标签: sql

SQL COALESCE()函数可以用一个句子来描述:COALESCE返回为每一行传递的第一个非NULL值。请以简单,合乎逻辑的方式举一个例子,重新写出这句话。

-- assume the a.id column contains the one and only NULL value in a large table
SELECT COALESCE(a.id, a.id) AS modified_id
FROM accounts a

这具有令人惊讶的结果,它实际上是在新列modified_id中创建一个值!如果函数中的第一个参数为NULL,那么第二个参数(用于替换第一个参数中NULL的值)如何在结果Modify_id中产生任何结果?我们知道第二个参数中的值必须为NULL,因为它实际上是第一个参数。

编辑:

以下代码在2018-08-05_20-39-19.jpg

中产生结果
SELECT *
FROM accounts a
LEFT JOIN orders o
ON a.id = o.account_id
WHERE o.total IS NULL;

以下代码在2018-08-05_20-43-14.jpg

中产生结果
SELECT
    COALESCE(a.id, a.id) AS filled_id,
    a.name, a.website, a.lat, a.long, a.primary_poc, a.sales_rep_id, o.*
FROM accounts a
LEFT JOIN orders o
ON a.id = o.account_id
WHERE o.total IS NULL;

2 个答案:

答案 0 :(得分:1)

您必须输入错字或其他简单原因。

验证非常容易,只需在同一查询中同时返回a.idCOALESCE(a.id, a.id)。确保使用别名,以使您知道您正在查看的是a.id,而不是其他表中的id

SELECT
    a.id AS a_id,
    COALESCE(a.id, a.id) AS filled_id,
    a.name, a.website, a.lat, a.long, a.primary_poc, a.sales_rep_id, o.*
FROM accounts a
LEFT JOIN orders o
ON a.id = o.account_id
WHERE o.total IS NULL;

答案 1 :(得分:0)

对于您提供的这个示例,如果a.id为null,那么第二个a.id当然也将为null。

COALESCE对于例如左连接

很有帮助
select coalesce(DE.user_id, KBU.user_id, OUD.user_id) as User_ID          
        LEFT JOIN dm.EDW.DIM_Employee DE
            ON de.user_id = RIGHT(SubQuery.[UserID], LEN(SubQuery.[UserID]) - 5)
            AND de.dss_current_flag = 'Y'
            AND de.Dss_Deleted_Flag = 'N'

        -- Some of the users are missing from our Dim Table so need to use other sources
        LEFT JOIN tts..load_KBNetwork_Users KBU
            ON KBU.UID = RIGHT(SubQuery.[UserID], LEN(SubQuery.[UserID]) - 5)

        LEFT JOIN dm.dbo.organisationunitdimension OUD
            ON oud.OrgUnitLevel5SourceId = RIGHT(SubQuery.[UserID], LEN(SubQuery.[UserID]) - 5)
            AND oud.dss_current_flag = 'Y'

如果DE为空,那么我可以从接下来的两个空值中获取第一个空值(如果可能的话)