0

我有如下文字。

    ( ( 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.* 替换为条件 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 或任何其他技巧。

注意:对我来说,主要挑战似乎是替换查询顺序保持正确的方式(即正确放置打开和关闭括号)

4

1 回答 1

0

尝试这个。

SELECT REGEXP_REPLACE (yourtext, 'tt\.(.+) ', 'tt.\1 IS NOT NULL AND tt.\1 ')
  FROM yourtable;
于 2017-11-10T10:15:40.890 回答