【问题标题】:How to use a CASE statement with a JOIN如何将 CASE 语句与 JOIN 一起使用
【发布时间】:2019-06-27 03:13:06
【问题描述】:

我正在尝试使用根据某些 case 语句而变化的 join 语句。当字段 lane.dest_postal_code_prefix 不是 NULL 时,我希望连接类似于下面的第一个代码块。 当字段 lane.dest_postal_code_prefix 为 NULL 时,我希望连接类似于下面的第二个代码块。 (注意两种情况下ON条件的区别)

我需要一些帮助,将 case 语句添加到 join 子句中。

--WHEN lane.dest_postal_code_prefix is NOT NULL
SELECT * FROM big_bucket_bridge A
    LEFT JOIN lane 
    ON
    (
    A.customer_country = lane.dest_country_code
    AND
    SUBSTRING( A.ddm_zip, 1, LENGTH( lane.dest_postal_code_prefix ) ) = 
    lane.dest_postal_code_prefix
        )

WHERE  
    snapshot_day between '2019-06-23'-22 and '2019-06-23'
    AND (is_before_cutoff_g OR (is_before_cutoff_opt_g and not under_two))
    AND row_n =1
;

--WHEN lane.dest_postal_code_prefix is NULL
SELECT * FROM big_bucket_bridge A
    LEFT JOIN lane 
    ON
    (
    A.customer_country = lane.dest_country_code
    )

WHERE  
    snapshot_day between '2019-06-23'-22 and '2019-06-23'
    AND (is_before_cutoff_g OR (is_before_cutoff_opt_g and not under_two))
    AND row_n =1
;

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您可以像这样使用一个 ON 子句:

    ON
    (
    A.customer_country = lane.dest_country_code
    AND
    COALESCE(SUBSTRING(A.ddm_zip, 1, LENGTH( lane.dest_postal_code_prefix )), '') = CASE 
      WHEN lane.dest_postal_code_prefix IS NOT NULL THEN lane.dest_postal_code_prefix 
      ELSE COALESCE(SUBSTRING(A.ddm_zip, 1, LENGTH( lane.dest_postal_code_prefix )), '')
    END
    )
    

    在第二种情况下(其他部分),条件始终为真,因为它是:

    COALESCE(SUBSTRING(A.ddm_zip, 1, LENGTH( lane.dest_postal_code_prefix )), '') = COALESCE(SUBSTRING(A.ddm_zip, 1, LENGTH( lane.dest_postal_code_prefix )), '')
    

    所以唯一的实际条件是

    A.customer_country = lane.dest_country_code
    

    【讨论】:

    • ON 子句的这一部分不在您的答案中 A.ead_2g_route_id = lane.route_id ......这部分应该存在 WHEN lane.dest_postal_code_prefix 不是 NULL 所以我有点困惑?
    • 好的,感谢您的编辑,我尝试使用此方法,但出现语法错误 ")" 。不太清楚为什么,因为我所有的括号都应该是正确的。我已经用我在发生错误的连接子句中使用的更新字段更新了问题
    • 我认为您需要删除双括号:... = lane.dest_postal_code_prefix))
    • 刚刚尝试过,仍然是相同的错误 SUBSTRING(A.ddm_zip, 1, LENGTH(lane.dest_postal_code_prefix)) = CASE WHEN lane.dest_postal_code_prefix IS NOT NULL THEN lane.dest_postal_code_prefix ELSE SUBSTRING(A.ddm_zip , 1, LENGTH(lane.dest_postal_code_prefix))
    • 这是甲骨文吗? Oracle 中没有 SUBSTRING 函数。使用 SUBSTR
    猜你喜欢
    • 2013-07-18
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2013-07-01
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多