【问题标题】:return more than 1 value after THEN statement used with CASE在与 CASE 一起使用 THEN 语句后返回超过 1 个值
【发布时间】:2023-04-05 11:03:02
【问题描述】:

以下是我的查询:

UPDATE DSOPI_PERSON_ADDR_RULE ADDR
SET ADDR.DEPT_NAME =
  CASE
    WHEN regexp_like (UPPER(addr.src_address_line1),     'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
    AND ADDR.ORG_NAME IS NOT NULL
    THEN ADDR.SRC_ADDRESS_LINE1
    WHEN regexp_like (UPPER(addr.src_address_line2), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
    AND ADDR.ORG_NAME IS NOT NULL
    THEN ADDR.SRC_ADDRESS_LINE2
    WHEN regexp_like (UPPER(addr.src_address_line3), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
    AND ADDR.ORG_NAME IS NOT NULL
    THEN ADDR.SRC_ADDRESS_LINE3
    WHEN regexp_like (UPPER(addr.src_address_line4), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
    AND ADDR.ORG_NAME IS NOT NULL
    THEN ADDR.SRC_ADDRESS_LINE4
    ELSE NULL
 END;

我想做的是,当 case 条件为真时,我想让相应的地址行为 NULL。有没有办法用这段代码实现它?

【问题讨论】:

    标签: sql oracle set case


    【解决方案1】:

    您可以选择为每个地址字段添加额外的CASE 语句:

    代码是重复的,但这允许您在满足条件时将地址行设置为空。

    UPDATE DSOPI_PERSON_ADDR_RULE ADDR
    SET ADDR.DEPT_NAME =
       CASE
          WHEN regexp_like (UPPER(addr.src_address_line1),
             'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
             AND ADDR.ORG_NAME IS NOT NULL
             THEN ADDR.SRC_ADDRESS_LINE1
          WHEN regexp_like (UPPER(addr.src_address_line2), 
             'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
             AND ADDR.ORG_NAME IS NOT NULL
             THEN ADDR.SRC_ADDRESS_LINE2
          WHEN regexp_like (UPPER(addr.src_address_line3), 
             'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
             AND ADDR.ORG_NAME IS NOT NULL
             THEN ADDR.SRC_ADDRESS_LINE3
          WHEN regexp_like (UPPER(addr.src_address_line4), 
             'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
             AND ADDR.ORG_NAME IS NOT NULL
             THEN ADDR.SRC_ADDRESS_LINE4
          ELSE NULL
       END
       , ADDR.SRC_Address_Line1 =
            CASE
               WHEN regexp_like (UPPER(addr.src_address_line1),     
                  'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
                  AND ADDR.ORG_NAME IS NOT NULL
                  THEN NULL
               ELSE ADDR.SRC_Address_Line1
            END
       , ADDR.SRC_Address_Line2 =
            CASE
               WHEN regexp_like (UPPER(addr.src_address_line2),     
                  'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
                  AND ADDR.ORG_NAME IS NOT NULL
                  THEN NULL
               ELSE ADDR.SRC_Address_Line2
            END
       , ADDR.SRC_Address_Line3 =
            CASE
               WHEN regexp_like (UPPER(addr.src_address_line3),      
                  'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
                  AND ADDR.ORG_NAME IS NOT NULL
                  THEN NULL
               ELSE ADDR.SRC_Address_Line3
            END
       , ADDR.SRC_Address_Line4 =
            CASE
               WHEN regexp_like (UPPER(addr.src_address_line4),     
                  'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG')
                  AND ADDR.ORG_NAME IS NOT NULL
                  THEN NULL
               ELSE ADDR.SRC_Address_Line4
            END;
    

    【讨论】:

    • 只是想一想:这种方法执行查询不会花费两倍的时间吗?
    • 您必须在您的环境中进行测试。我通常在 SQL Server 中,并且类似的操作(ORDER BY 中的 CASE 语句)不会在查询中多次计算,所以我希望 Oracle 的行为类似。
    【解决方案2】:

    所以如果第一个 WHEN 条件为真,您想将 src_address_line1 设置为 NULL,等等?在这种情况下,我会这样做:

    UPDATE DSOPI_PERSON_ADDR_RULE ADDR
    
    SET 
    addr.src_address_line1 = 
    CASE WHEN regexp_like (UPPER(addr.src_address_line1), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG') 
    AND ADDR.ORG_NAME IS NOT NULL 
    THEN NULL ELSE addr.src_address_line1 END, 
    
    addr.src_address_line2 = 
    CASE WHEN regexp_like (UPPER(addr.src_address_line2), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG') 
    AND ADDR.ORG_NAME IS NOT NULL 
    THEN NULL ELSE addr.src_address_line2 END, 
    
    addr.src_address_line3 = 
    CASE WHEN regexp_like (UPPER(addr.src_address_line3), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG') 
    AND ADDR.ORG_NAME IS NOT NULL 
    THEN NULL ELSE addr.src_address_line3 END, 
    
    addr.src_address_line4 = 
    CASE WHEN regexp_like (UPPER(addr.src_address_line4), 'DEP|DPT$|ABT|DIP.|DIPART|AFDEL|AVDEL|AVD.|DIV|PGRD|PGP|PPG') 
    AND ADDR.ORG_NAME IS NOT NULL 
    THEN NULL ELSE addr.src_address_line4 END;  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 2018-12-19
      • 2010-12-12
      相关资源
      最近更新 更多