sql - 与 CASE 一起使用的 THEN 语句后返回超过 1 个值

标签 sql oracle set 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;

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

最佳答案

您可以选择的一个选项是为每个地址字段添加额外的 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 - 与 CASE 一起使用的 THEN 语句后返回超过 1 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12966937/

相关文章:

sql - Oracle - 如何使用 FAST REFRESH 和 JOINS 创建物化 View

sql - NTILE 仅适用于不为零的值

mongodb - 为什么我的更新 $set 代码会删除我的整个文档?

sql - 用于替换级联字段中的空值的 CASE 语句

java - 存储过程通过 Java 运行比直接在数据库上运行慢 30%

oracle - 如何限制 ORACLE 查询返回的记录数?

java - 是否有一种有效的算法可以将几组数字打包到几个桶中?

java - 任意数量集合的笛卡尔积

sql - Java DB/Derby-表名中的空白-如何转义?

sql-server - 当删除约束时,支持索引也会被删除吗?