2017-11-10 9 views
0

다음과 같은 텍스트가 있습니다.REGEXP_REPLACE query oracle

((tt.TRAN_TYPE IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1332) 
    AND tt.CONTRACT IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1333) 
    AND tt.CUSTOMER_STATE NOT IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1334) 
    AND tt.COT_IND IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1335)) 
OR  (tt.TRAN_TYPE IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1336) 
    AND tt.WHLSE_COT NOT IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1337) 
    AND tt.COT_IND IN 
     (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1338))) 

다음과 같이 tt. *를 condition tt. * IS NOT NULL 및 tt. * ...로 바꾸어야합니다.

( 
      ((tt.TRAN_TYPE IS NOT NULL AND tt.TRAN_TYPE IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1332)) 
      AND (tt.CONTRACT IS NOT NULL AND tt.CONTRACT IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1333)) 
      AND (tt.CUSTOMER_STATE IS NOT NULL AND tt.CUSTOMER_STATE NOT IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1334)) 
      AND (tt.COT_IND IS NOT NULL AND tt.COT_IND IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1335))) 
     OR ((tt.TRAN_TYPE IS NOT NULL AND tt.TRAN_TYPE IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1336)) 
      AND (tt.WHLSE_COT IS NOT NULL AND tt.WHLSE_COT NOT IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1337)) 
      AND (tt.COT_IND IS NOT NULL AND tt.COT_IND IN (SELECT RULE_VALUE FROM GP_RULE_VALUE WHERE RULE_ID=1338))) 
     ) 

ORACLE에서 사용 가능한 경우 REGEXP_REPLACE 또는 다른 트릭을 제공하십시오.

참고 : 나에게 주요 과제는 해당 쿼리 순서는 적절한 (제대로 배치 즉 개폐 브라켓)

답변

0

을이 시도 남아있는 방식을 대체 할 것으로 보인다.

SELECT REGEXP_REPLACE (yourtext, 'tt\.(.+) ', 'tt.\1 IS NOT NULL AND tt.\1 ') 
    FROM yourtable; 
+0

이것은 null 조건 만 추가합니다. 그러나 여러 개의 AND/OR가 포함되어 있으므로 질의 순서가 영향을받지 않도록 대괄호를 추가해야합니다. –

+0

지금까지 내가 한 것은 다음과 같습니다. IN REGEXP_REPLACE을 선택 ('(tt.TRAN_TYPE (GP_RULE_VALUE FROM RULE_VALUE을 선택 WHERE RULE_ID = 1332) IN 및 tt.CONTRACT (FROM RULE_VALUE을 선택 GP_RULE_VALUE WHERE RULE_ID = 1333) 및 tt.CUSTOMER_STATE이 (IN GP_RULE_VALUE로부터 RULE_VALUE을 선택하지 ([^] +) ([: alpha :] | [: 공백 : 1334) 및 (GP_RULE_VALUE에서 RULE_ID가 1335 인 RULE_VALUE를 선택하십시오.) ) 이중에서 ','(\ 1 \ 2 IS NOT NULL과 \ 1 \ 2 \ 3) '); 이제는 숫자 뒤에 닫는 괄호를 추가해야합니다. –

+0

다음 쿼리는 작동합니다. ' (IN REGEXP_REPLACE을 선택 ('(tt.TRAN_TYPE는 GP_RULE_VALUE FROM RULE_VALUE을 선택 WHERE RULE_ID = 1332) 및 IN tt.CONTRACT (FROM RULE_VALUE을 선택 GP_RULE_VALUE WHERE RULE_ID = 1333) 및 tt.CUSTOMER_STATE이 이 (FROM RULE_VALUE을 선택하지 IN GP_RULE_VALUE WHERE RULE_ID = 1334) ) 또는 IN (tt.TRAN_TYPE (GP_RULE_VALUE FROM RULE_VALUE을 선택 WHERE RULE_ID = 1336) 및 tt.WHLSE_COT하지 (GP_RULE_VALUE WHERE RULE_ID = 1337) ) ','FROM RULE_VALUE을 선택 IN (([^] +) ([0 : 9] +) ',': 공백 : 1 \ 2는 NULL이 아니며 \ 1 \ 2 \ 3 \ 4) ')를 이중으로 사용합니다. ' –