2015-02-06 68 views
0

Instring功能我在與VARCHAR2列「Detail_Number」有記錄的Oracle數據庫中的表可以看出如下─案例條件和在Oracle

Detail_Number 
-------------- 
P1464187 
1-17J3P 
VAR1460621 
P15000566 
VRH-P146310034 
RH-73082_SS1 
19502744 

現在,我想用一個case語句,其如果特殊字符存在,則只返回特殊字符'_'之前的Detail_Number列的部分。否則,只需返回Detail_Number。

我寫的case語句是 -

CASE 
    WHEN INSTR(A.AGREEMENT_NUMBER, '_') IS NOT NULL THEN SUBSTR(A.AGREEMENT_NUMBER, 0, INSTR(A.AGREEMENT_NUMBER, '_')-1) 
    WHEN INSTR(A.AGREEMENT_NUMBER, '_') = 0 THEN A.AGREEMENT_NUMBER 
    --ELSE A.AGREEMENT_NUMBER 
END AS Output 

查詢的結果如下 -

Detail_Number Output 
------------- -------- 
P1464187  
1-17J3P 
VAR1460621 
P15000566 
VRH-P146310034 
RH-73082_SS1 RH-73082 
19502744  

在這裏,我以後獲得部分 '_' 得到跳過。但是,如果'_'不存在,它將返回空值。你可以幫助我嗎?

謝謝。

+0

什麼是你想要的結果嗎? – Mihai 2015-02-06 18:44:57

+0

我想出溶液 - – 0nir 2015-02-06 18:44:57

+0

CASE WHEN INSTR(A.AGREEMENT_NUMBER, '_')<> 0 THEN SUBSTR(A.AGREEMENT_NUMBER,0,INSTR(A.AGREEMENT_NUMBER, '_') - 1) WHEN INSTR( A.AGREEMENT_NUMBER,'_')= 0那麼A.AGREEMENT_NUMBER --ELSE A.AGREEMENT_NUMBER END AS輸出 – 0nir 2015-02-06 18:45:39

回答

3

您的意思是?

SQL> with 
    2 data as (select 'P1464187' t# from dual union all 
    3    select '1-17J3P' t# from dual union all 
    4    select 'VAR1460621' t# from dual union all 
    5    select 'P15000566' t# from dual union all 
    6    select 'VRH-P146310034' t# from dual union all 
    7    select 'RH-73082_SS1' t# from dual union all 
    8    select '19502744' t# from dual) 
    9 select 
10 substr(t#, 1, instr(t# || '_', '_') - 1) 
11 from 
12 data; 

SUBSTR(T#,1,INSTR(T#||'_','_')-1) 
-------------------------------------------------------- 
P1464187 
1-17J3P 
VAR1460621 
P15000566 
VRH-P146310034 
RH-73082 
19502744 

7 rows selected. 
+0

這也會起作用。謝謝 – 0nir 2015-02-06 18:46:51

1

使用REGEXP_REPLACE一個選項(可能不是大builk高效桑德斯INSTR選項;)(但仍有效)

with w_data as ( 
     select rtrim('P1464187  ') c from dual union all 
     select rtrim('1-17J3P  ') c from dual union all 
     select rtrim('VAR1460621 ') c from dual union all 
     select rtrim('P15000566  ') c from dual union all 
     select rtrim('VRH-P146310034') c from dual union all 
     select rtrim('RH-73082_SS1 ') c from dual union all 
     select rtrim('19502744  ') c from dual 
     ) 
    Select c, regexp_replace(c, '^(.*)[_$]','\1') d 
    from w_data; 


    C    D 
    -------------- ---------------------------------------- 
    P1464187  P1464187 
    1-17J3P  1-17J3P 
    VAR1460621  VAR1460621 
    P15000566  P15000566 
    VRH-P146310034 VRH-P146310034 
    RH-73082_SS1 RH-73082SS1 
    19502744  19502744 

    7 rows selected.