2013-04-22 37 views
0

我有如下表解析子欄在SQL

DRIVER_GID    DRIVER_REFNUM_QUAL_GID 

SDL2/C001.100000  SDL2.486900 CURRENT DISTRICT 
SDL2/C001.100000  SDL2.486900 PERMANENT DISTRICT 
SDL2/C001.100000000  SDL2.486900 CURRENT DISTRICT 
SDL2/C001.100000000  SDL2.486900 PERMANENT DISTRICT 
SDL2.600119036   SDL2.436001 CURRENT DISTRICT 
SDL2.600119036   SDL2.436001 PERMANENT DISTRICT 

我需要提取字符串之後的數值「SDL2。」來自DRIVER_REFNUM_QUAL_GID列。任何人都可以請推薦一個查詢。

+1

見http://www.codeproject.com/Articles/7938/SQL-User-Defined-Function-to-Parse-a-Delimited-Str找到一個可以工作的解決方案。 – 2013-04-22 20:10:34

+2

您正在使用哪些DBMS? – 2013-04-22 20:29:32

+1

是「SDL」之後的數字。總是從6位開始,6個字符寬?如果是這樣,一個簡單的'substr(driver_refnum_qual_gid,6,6)'將提取你想要的字符串。 – 2013-04-22 20:32:08

回答

1

使用regexp_substrORACLE功能:

select regexp_substr(DRIVER_REFNUM_QUAL_GID, '[[:digit:]]{6}') from YOURTABLE 

這將從yourtable的DRIVER_REFNUM_QUAL_GID列中提取相鄰的6位數字。

如果你喜歡提取所有位數以下週期則使用下面的代碼:

select regexp_substr(DRIVER_REFNUM_QUAL_GID, '(\.)([[:digit:]]+)',1,1,'i',2) from YOURTABLE 

爲了消除NULLS,您可以使用NVL功能。

例如,

select NVL(regexp_substr(DRIVER_REFNUM_QUAL_GID, '(\.)([[:digit:]]+)',1,1,'i',2),999999) from YOURTABLE 

因此,如果regexp_substr函數的結果是NULL,其結果將是999999

+0

嘗試:從DRIVER_REFNUM ##選擇regexp_replace(DRIVER_REFNUM_QUAL_GID,'[^ [:digit:]]')結果:java.sql.SQLException:列索引無效,我想我們已經接近讓我知道確切的sql – user2146080 2013-04-22 20:58:24

+0

重試代碼編輯後。 – bonsvr 2013-04-22 21:02:12

+0

這不允許點後面的可變數字位數。 – McCee 2013-04-22 21:05:36

0

考慮你只SDL2.後需要數,並考慮到數字的數量可能上升到20位的最大值,你可以使用的東西,喜歡 -

select REGEXP_SUBSTR('SDL2.486900 CURRENT DISTRICT', '[[:digit:]]{2,20}') numval from dual;

您可以編輯號碼20到滿足您的需求。

所以它看起來喜歡 -

select REGEXP_SUBSTR(DRIVER_REFNUM_QUAL_GID,'[[:digit:]]{2,20}') from your_table;

+0

我想只有486900,可以請給我發送sql – user2146080 2013-04-23 14:04:43

+0

@ user2146080編輯我的答案。 – Annjawn 2013-04-23 18:07:31