2016-02-05 1 views
0

Я пытался вставить определенные данные из одной таблицы (table1) в другую таблицу (table2) таким образом, как если бы данные были существующими, просто обновите данные или вставьте данные. Но проблема теперь я сталкиваюсь, когда я добавил последнее условие, например, если first_name, например, «mss%», мне нужно вставить SERVICE_TYPE_ID 10 else 20. Но это не происходит для этого случая и не останавливается на всех случаях. я хотел бы знать, что случилось с последним случаем Condtionпроблема сложения слияния (в основном для обновления) block block

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

это в основном неисправным для раздела обновлений Слить и вставив 20 вместо 10 Вот мой полный запрос оракула

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%'

+0

У вас есть данные в таблице table1.first_name, которая начинается с «mss» (в нижнем регистре)? – Boneist

+0

@Boneist Да, у него есть данные, такие как mss-testeronet-mai-rb и т. Д. Datas – peter

+1

Какой результат вы получите, если вы это сделаете: 'select count (*) из таблицы1, где trim (b.first_name), например 'mss%';'? – Boneist

ответ

2

В вашей вставки, последнее выражение в вашем случае утверждения trim(b.first_name) like 'mss%'.

Однако вставить часть вашего оператора слияния имеет предикат: WHERE SUBSTR(b.first_name, 1, 1) != ' '), который исключает все строки, где есть пробелы до mss.

Это может быть причиной вашей проблемы. Я предлагаю вам либо удалить этот предикат из вставки, либо добавить or trim(b.first_name) like 'mss%' в предложение where.

+0

Теперь я запутался, вы можете его очистить. ГДЕ SUBSTR ( b.first_name, 1,1 ) ! = '' Не будет добавлять пробелы, то, как он будет добавить его – peter

+1

'WHERE SUBSTR (b.first_name, 1,1)! = '«' «где первый символ столбца first_name не является пробелом». Ваш оператор case убирает пробелы как спереди, так и в конце столбца first_name ** перед ** проверяет, начинается ли результирующая строка с 'mss'. Это означает, что даже если у вас есть строки, соответствующие этому выражению, оператор case, предложение where исключает большинство из них, поскольку у них есть как минимум одно место в начале first_name. – Boneist