C# 案例块中的合并语句问题(主要用于更新)

C# 案例块中的合并语句问题(主要用于更新),c#,.net,oracle,console-application,sql-merge,C#,.net,Oracle,Console Application,Sql Merge,我试图将某些数据从一个表(table1)插入到另一个表(table2),就像数据存在一样,只是更新数据或插入数据。但我现在面临的问题是,当我添加了最后一个条件,如if first_name,如'mss%'时,我必须执行插入服务\u TYPE_ID 10 else 20。但这一情况下不会发生,所有情况都会成功。因此,我想知道最后一个情况有什么问题 trim(b.first_name) like 'mss%' TH

我试图将某些数据从一个表(
table1
)插入到另一个表(
table2
),就像数据存在一样,只是更新数据或插入数据。但我现在面临的问题是,当我添加了最后一个条件,如if first_name,如'mss%'时,我必须执行插入服务\u 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) != ' '
合并到表2中a
在上使用表1 b(a.第二个名称=b.第一个名称)
当匹配时
更新
设置a.friendly\u name=TRIM(b.friendly\u name),
a、 科目编号=修剪(b.科目编号),
a、 ne_类型=修剪(b.ci_类型),
a、 服务类型标识=案例
当上部(修剪(b.company_name))如“%MWAN%”时
或上部(修剪(b.公司名称))如“%MGWAN%”
或上部(修剪(b.company_name))如“%MWLAN%”
或上部(修剪(b.company_name))如“%MLAN%”
或更高(修剪(b.公司名称))如“%DDOS%”
或修剪(b.名字)如“mss%”
然后10个,另外20个结束,
a、 在“Y”中查找
其中a.账号b.账号
当不匹配时
插入(网元号、第二个网元名、公司id、网元类型、网元状态、服务类型id)
值(s_节点_顺序_下一步,
TRIM(b.名字),TRIM(b.公司id),
修剪(b.ci_类型),修剪(b.ci_状态),
案例
当上部(修剪(b.company_name))如“%MWAN%”时
或上部(修剪(b.公司名称))如“%MGWAN%”
或上部(修剪(b.company_name))如“%MWLAN%”
或上部(修剪(b.company_name))如“%MLAN%”
或更高(修剪(b.公司名称))如“%DDOS%”
或修剪(b.名字)如“mss%”
然后是10(完)
其中SUBSTR(b.first_name,1,1)!=“”

所有case条件都是成功的,除了指向
trim(b.first_name)的条件,如“mss%”
在插入中,case语句中的最后一个表达式是
trim(b.first_name),如“mss%”

但是,merge语句的insert部分有一个谓词:
WHERE SUBSTR(b.first_name,1,1)!=“”)
它排除了
mss
前面有空格的所有行


这很可能是您的问题的原因。我建议您从insert部分删除该谓词,或者在where子句中添加
或trim(b.first_name),如'mss%'

在insert中,case语句中的最后一个表达式是
trim(b.first_name),如'mss%'。

但是,merge语句的insert部分有一个谓词:
WHERE SUBSTR(b.first_name,1,1)!=“”)
它排除了
mss
前面有空格的所有行


这很可能是您的问题的原因。我建议您从insert部分删除该谓词,或者在where子句中添加
或trim(b.first_name),如'mss%'

表1.first_name列中是否有以“mss”(小写)开头的数据?@Boneist是的,它有mss TesterNet mai rb等数据,如果这样做会得到什么结果:
从表1中选择count(*),其中trim(b.first_name)如“mss%”?@Boneist 11000条记录在表1中名为“mss%”的
选择计数(*)如何?您的表中是否有数据1.以“mss”(小写)开头的名字列@Boneist是的,它有数据,如mss TesterNet mai rb等数据如果您这样做会得到什么结果:
从表1中选择计数(*),其中修剪(b.first_name)如“mss%”?@Boneist 11000条记录在表1中名为“mss%”的
选择计数(*)如何?我现在糊涂了,你能清除它吗。其中SUBSTR(b.first_name,1,1)!=不会添加任何空格,那么它将如何添加它
WHERE SUBSTR(b.first_name,1,1)!=“”表示“其中第一个名称列的第一个字符不是空格”。在检查结果字符串是否以
mss
开头之前,您的case语句会修剪first_name列前面和末尾的空格。这意味着,即使您有与case语句中的表达式匹配的行,您的where子句也会排除其中的大部分,因为它们在第一个_名称的开头至少有一个空格。我现在很困惑,您能清除它吗。其中SUBSTR(b.first_name,1,1)!=不会添加任何空格,那么它将如何添加它
WHERE SUBSTR(b.first_name,1,1)!=“”表示“其中第一个名称列的第一个字符不是空格”。在检查结果字符串是否以
mss
开头之前,您的case语句会修剪first_name列前面和末尾的空格。这意味着,即使有与case语句中的表达式匹配的行,where子句也会排除其中的大部分,因为它们在第一个_名称的开头至少有一个空格。