我有一個字段FARMBOL,它具有我需要拆分的信息。 在該領域的某個時刻,它會說「IMPORTER:」,後面是更多信息。需要提取Oracle SQL中子字符串之前/之後的所有內容
即「20394823409危害:李四」
我需要提取「20394823409」作爲一個字段,以及「進口者:李四」的另一種。我怎樣才能做到這一點?該代碼是Oracle數據庫中SSRS查詢的一部分。
我有一個字段FARMBOL,它具有我需要拆分的信息。 在該領域的某個時刻,它會說「IMPORTER:」,後面是更多信息。需要提取Oracle SQL中子字符串之前/之後的所有內容
即「20394823409危害:李四」
我需要提取「20394823409」作爲一個字段,以及「進口者:李四」的另一種。我怎樣才能做到這一點?該代碼是Oracle數據庫中SSRS查詢的一部分。
如果它真的會總是說「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
如果你需要一個更靈活的模式,那麼你可以使用正則表達式來代替,但是,似乎是矯枉過正這裏。
不得不這樣做表明你應該真的在單獨的列中存儲這些數據,可能使用不同的數據類型,而不是在單個字符串列中混合在一起。
繁榮。謝啦。 –
你想實現什麼邏輯?請閱讀第一列的第一個空格以及第一個空格之後的所有內容。閱讀第一個非數字字符?第一列第一個字母字符前的所有內容? –
閱讀直到字符串的「IMPORTER」部分作爲第1列,「IMPORTER」以及後面的所有部分作爲第2列。 –
因此,每一行都將具有文字「IMPORTER」嗎? –