2015-02-06 66 views
-1

我在表具有類似於此值的列:選擇語句來顯示期望的輸出

key_value 

例如:

3933984948498934_khkhk 
81299191ahgtyu092092092019_92982 
abh182772hjjlj98879bjj_122778999 

_是在所有的值常見。我需要一個腳本來複制值的一部分,即複製_之前的所有內容,並且不會在該列中的所有值之後顯示_之後的任何內容。

我需要一個select語句來顯示上面提到的輸出。

如:實際值是3933984948498934_khkhk,但我只需要3933984948498934 實際值81299191ahgtyu092092092019_92982,但所需的輸出是81299191ahgtyu092092092019

我覺得使用substr函數很麻煩,因爲這些值是動態的。

+0

SUBSTR是好的,你也需要使用position來查找_。 (我希望位置支持Oracle,否則尋找類似的功能...) – jarlh 2015-02-06 16:35:36

+0

@jarhl - [INSTR](http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions080.htm) * 8) – 2015-02-06 16:37:01

回答

1

你可以使用正則表達式,例如:

SELECT REGEXP_SUBSTR(key_value, '^[^_]*') 
    FROM mytable; 

不過正則表達式是資源密集型;你會使用SUBSTR()INSTR()更好的服務:

SELECT SUBSTR(key_value, 1, INSTR(key_value, '_') - 1) 
    FROM mytable; 

注意,這後一種方法會失敗(實際上,它會返回NULL)如果key_value不包含下劃線_。所以你可以把它包裝在COALESCE()

SELECT COALESCE(SUBSTR(key_value, 1, INSTR(key_value, '_') - 1), key_value) 
    FROM mytable;