【问题标题】:merge statement issue(mainly for update ) incase block合并语句问题(主要用于更新) incase 块
【发布时间】:2016-02-05 07:57:25
【问题描述】:

我试图将某些数据从一个表(table1)插入另一个表(table2),就像数据是否存在一样,只需更新数据或插入数据。但我现在面临的问题是,当我添加最后一个条件时,例如 if first_name like 'mss%' 我必须插入 SERVICE_TYPE_ID 10 else 20。但是这种情况下并没有发生这种情况,并且所有情况下都成功。所以我想知道什么最后一种情况是错误的

trim(b.first_name) like 'mss%'     
                                      THEN 10
                                      ELSE 20

这主要是合并更新部分失败并插入 20 而不是 10 这是我完整的 oracle 查询

MERGE INTO table2 a
USING table1 b ON (a.second_name = b.first_name)

WHEN MATCHED THEN
  UPDATE
  SET a.friendly_name = TRIM(b.friendly_name),
    a.account_number  = TRIM(b.account_no),
    a.ne_type         = TRIM(b.ci_type),
    a.service_type_id = CASE
                        WHEN upper(trim(b.company_name)) LIKE '%MWAN%'
                             OR upper(trim(b.company_name)) LIKE '%MGWAN%'
                             OR upper(trim(b.company_name)) LIKE '%MWLAN%'
                             OR upper(trim(b.company_name)) LIKE '%MLAN%'
                             OR upper(trim(b.company_name)) LIKE '%DDOS%'
                             OR trim(b.first_name) LIKE 'mss%'
                          THEN 10 ELSE 20 END,
    a.to_locate_in_gis ='Y'
  WHERE a.account_number <> b.account_no

WHEN NOT MATCHED THEN
  INSERT (ne_slno, second_name, company_id, ne_type, ne_status, service_type_id)
  VALUES (s_node_seq_nextval,
          TRIM(b.first_name), TRIM(b.company_id), 
          TRIM(b.ci_type), TRIM(b.ci_status),
      CASE
      WHEN upper(trim(b.company_name)) LIKE '%MWAN%'
           OR upper(trim(b.company_name)) LIKE '%MGWAN%'
           OR upper(trim(b.company_name)) LIKE '%MWLAN%'
           OR upper(trim(b.company_name)) LIKE '%MLAN%'
           OR upper(trim(b.company_name)) LIKE '%DDOS%'
           OR trim(b.first_name) LIKE 'mss%'
        THEN 10 ELSE 20 END)
  WHERE SUBSTR(b.first_name, 1, 1) != ' '

除了指向trim(b.first_name) like 'mss%'的情况外,所有情况下都是成功的

【问题讨论】:

  • table1.first_name 列中是否有以“mss”(小写)开头的数据?
  • @Boneist 是的,它有 mss-testeronet-mai-rb 等数据
  • 如果这样做会得到什么结果:select count(*) from table1 where trim(b.first_name) like 'mss%';?
  • @Boneist 有 11000 条记录
  • select count(*) from table1 where first_name like 'mss%'; 呢?

标签: c# .net oracle console-application sql-merge


【解决方案1】:

在您的插入中,case 语句中的最后一个表达式是 trim(b.first_name) like 'mss%'

但是,然后插入部分合并语句有一个谓词:WHERE SUBSTR(b.first_name, 1, 1) != ' '),它排除了mss 之前有空格的所有行。

这很可能是您的问题的原因。我建议您要么从插入部分删除该谓词,要么将 or trim(b.first_name) like 'mss%' 添加到 where 子句中。

【讨论】:

  • 我现在很困惑,你能解决它吗? WHERE SUBSTR ( b.first_name, 1,1 ) != ' ' 不会添加任何空格,那么它将如何添加它
  • WHERE SUBSTR ( b.first_name, 1,1 ) != ' ' 表示“first_name 列的第一个字符不是空格”。您的 case 语句会在 之前 检查结果字符串是否以 mss 开头的 first_name 列的前面和结尾处修剪空格。这意味着即使您有与 case 语句匹配的行,您的 where 子句也会排除其中的大部分,因为它们在 first_name 的开头至少有一个空格。
猜你喜欢
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 2021-12-04
  • 2011-02-22
  • 2016-09-03
  • 1970-01-01
相关资源
最近更新 更多