0

我有一個字段FARMBOL,它具有我需要拆分的信息。 在該領域的某個時刻,它會說「IMPORTER:」,後面是更多信息。需要提取Oracle SQL中子字符串之前/之後的所有內容

即「20394823409危害:李四」

我需要提取「20394823409」作爲一個字段,以及「進口者:李四」的另一種。我怎樣才能做到這一點?該代碼是Oracle數據庫中SSRS查詢的一部分。

+0

你想實現什麼邏輯?請閱讀第一列的第一個空格以及第一個空格之後的所有內容。閱讀第一個非數字字符?第一列第一個字母字符前的所有內容? –

+0

閱讀直到字符串的「IMPORTER」部分作爲第1列,「IMPORTER」以及後面的所有部分作爲第2列。 –

+0

因此,每一行都將具有文字「IMPORTER」嗎? –

回答

1

如果它真的會總是說「IMPORTER:」那麼你可以使用substr()獲得子串,並instr()找出多少獲得:

with t (farmbol) as (select '20394823409 IMPORTER: John Doe' from dual) 
select substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as part1, 
    substr(farmbol, instr(farmbol, 'IMPORTER:')) as part2 
from t; 

PART1  PART2    
------------ ------------------ 
20394823409 IMPORTER: John Doe 

你可以操縱所提取的值,例如從第一部分修整後的空間,或將其轉換爲數字,如果它始終將是:

with t (farmbol) as (select '20394823409 IMPORTER: John Doe' from dual) 
select substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as part1, 
    trim(substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1)) as part1_trim, 
    cast(substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as number) as part1_num, 
    substr(farmbol, instr(farmbol, 'IMPORTER:')) as part2 
from t; 

PART1  PART1_TRIM  PART1_NUM PART2    
------------ ----------- ------------ ------------------ 
20394823409 20394823409 20394823409 IMPORTER: John Doe 

如果你真的不想要保持「IMPORTER:」字符串的一部分,你可以調整第二串的起始位置,通過固定值的長度:

with t (farmbol) as (select '20394823409 IMPORTER: John Doe' from dual) 
select cast(substr(farmbol, 1, instr(farmbol, 'IMPORTER:') - 1) as number) as part1_num, 
    trim(substr(farmbol, instr(farmbol, 'IMPORTER:') + 9)) as importer 
from t; 

    PART1_NUM IMPORTER 
------------ -------- 
20394823409 John Doe 

如果你需要一個更靈活的模式,那麼你可以使用正則表達式來代替,但是,似乎是矯枉過正這裏。

不得不這樣做表明你應該真的在單獨的列中存儲這些數據,可能使用不同的數據類型,而不是在單個字符串列中混合在一起。

+0

繁榮。謝啦。 –

相關問題