混合数据类型上的雪花连接不返回结果

问题描述 投票:0回答:2

我在尝试连接同一个表中的子查询时遇到了问题,但没有返回结果。

SELECT 
    CA.PARTICIPANT || CA.RECOGNITION_MONTH || CA.RECOGNITION_YEAR,
    CA.PLAN_NAME,
    PL.PLAN_NAME
FROM
    CSBI_DB.CS_SALES_OPS.CS_COMP_ANLTCS CA
LEFT JOIN
    (
        SELECT DISTINCT 
            PARTICIPANT || RECOGNITION_MONTH || RECOGNITION_YEAR AS MATCH_STRING,
            PLAN_NAME 
        FROM 
            CSBI_DB.CS_SALES_OPS.CS_COMP_ANLTCS 
        WHERE 
            PLAN_NAME IS NOT NULL
    ) PL 
ON
    TO_VARCHAR(PL.MATCH_STRING) = TO_VARCHAR(CA.PARTICIPANT || CA.RECOGNITION_MONTH || CA.RECOGNITION_YEAR)
WHERE 
    CA.PLAN_NAME IS NULL

我尝试了上述方法的几种变体,但没有填充 PL.PLAN_NAME 的结果。如果我仅使用“PARTICIPANT”(varchar 数据类型)字段加入,则结果将填充(尽管不是所需的结果),如果我仅使用连接的“RECOGNITION_MONTH”和“RECOGNITION_YEAR”(均为数字数据类型)字段加入,但在组合时两个我不断得到空结果。我也尝试过加入不将数字字段转换为 varchar 但没有运气。这看起来应该很简单,但显然我错过了一些东西......有人知道我哪里出错了吗?

sql snowflake-cloud-data-platform
2个回答
2
投票

如果这些列中的任何一个为 NULL(上面的注释表明它们是 NULL),那么串联最终将变为 NULL。这意味着您不会获得该连接条件的匹配项,因为 NULL 不 = NULL。

要修复此问题,您需要将可 NULL 字段合并为非 NULL 值,例如:

NVL(participant, '') || NVL(recognition_month, '') || NVL(recognition_year, '')
,或任何可 NULL 字段。


0
投票

如果您命名第一个选择结果,Snowflake将允许您在where子句中使用该标签,因此SQL可以更简单一些,如下所示:

SELECT 
    ca.participant || ca.recognition_month || ca.recognition_year AS ca_match_string,
    ca.plan_name,
    pl.plan_name
FROM
    csbi_db.cs_sales_ops.cs_comp_anltcs AS ca
LEFT JOIN
    (
        SELECT DISTINCT 
            participant || recognition_month || recognition_year AS match_string,
            plan_name 
        FROM 
            csbi_db.cs_sales_ops.cs_comp_anltcs 
        WHERE 
            plan_name IS NOT NULL
    ) AS pl 
ON
    pl.match_string = ca_match_string
WHERE 
    ca.plan_name IS NULL
© www.soinside.com 2019 - 2024. All rights reserved.