2016-03-15 64 views
1

我需要運行每週提取並從外部數據庫更新查找列值。我現在面臨的問題是,我查閱列x_ids,包含可變長度的字符串值和模式,即Oracle選擇值直到第一個空格或行尾

查找表

x_ids 
------ 
CHE00r 
NWA048 
HAM54O1A 
STR191O1C 

我的問題是,一些選擇要更新的值還包括空間,值後的括號。即上述STR191O1C可以反映STR191O1C(250)

我曾嘗試以下選擇我的更新: -

select substr(b.x_ids,1,instr(b.x_ids,' ',1,1) - 1) 
from lookup_tab a, external_tab b 
where a.site_id = B.SITE_ID 
and a.zone_id = b.zone_id 

這消除了括號的數字,並提供我正在尋找的價值,但也沒有返回值對於沒有括號或空格的其他行。 如果不存在空格或空格(如果存在),我需要返回所有值直到行尾。

回答

3

你可以隨時調整你的邏輯通過一空搜索之前加入這個字符串的空間來處理這個問題:

SELECT REGEXP_SUBSTR(b.x_ids, '^(.*?)($|)', 1, 1, NULL, 1) 
FROM lookup_tab a 
     JOIN external_tab b 
     ON a.site_id = B.SITE_ID and a.zone_id = b.zone_id 

或者使用:

select substr(b.x_ids, 1, instr(b.x_ids || ' ', ' ', 1, 1) - 1) 
from lookup_tab a join 
    external_tab b 
    on a.site_id = B.SITE_ID and a.zone_id = b.zone_id 
+0

感謝這正是我所追求的 - – MatteoS

+0

經過更新以反映此答案提供的解決方案 – MatteoS

0

您可以使用正則表達式做一個CASE聲明:

SELECT CASE WHEN INSTR(b.x_ids, ' ') = 0 THEN b.x_ids 
      ELSE SUBSTR(b.x_ids, 1, INSTR(b.x_ids, ' ') - 1) 
      END 
FROM lookup_tab a 
     JOIN external_tab b 
     ON a.site_id = B.SITE_ID and a.zone_id = b.zone_id 

或者:

SELECT SUBSTR(
     b.x_ids, 
     1, 
     CASE WHEN INSTR(b.x_ids, ' ') > 0 THEN INSTR(b.x_ids, ' ') - 1 END 
     ) 
FROM lookup_tab a 
     JOIN external_tab b 
     ON a.site_id = B.SITE_ID and a.zone_id = b.zone_id 
相關問題