[英]How to remove leftmost group of numbers from string in Oracle SQL?
我有一個像 T_44B56T4 這樣的字符串,我想制作 T_B56T4。 我不能使用位置邏輯,因為字符串可能是我想要制作 TE_BMT 的 TE_2BMT。
什么是最簡潔的 Oracle SQL 邏輯來從字符串中刪除最左邊的連續數字分組?
編輯:regex_replace 不可用,但我有 LTRIM、REPLACE、SUBSTR 等。
這符合要求嗎? 我假設有字母數字字符,然后是下划線,然后是要刪除的數字,然后是任何內容。
select regexp_replace(s, '^([[:alnum:]]+)_\d*(.*)$', '\1_\2')
from (
select 'T_44B56T4' s from dual union all
select 'TXM_1JK7B' from dual
)
它使用具有匹配組的正則表達式。
下划線之前的字母數字字符匹配並存儲在第一組中,然后下划線后跟 0 個數字(它將匹配盡可能多的數字),然后是存儲在第二組中的任何其他內容。
如果我們有匹配項,則字符串將替換為第一組的內容,后跟下划線和第二組的內容。
如果沒有匹配,則不會更改字符串。
如果我理解正確,您可以使用regexp_replace()
:
select regexp_replace('T_44B56T4', '_[0-9]+', '_')
這是您的兩個示例的 db<>fiddle。
注意:您的問題說的是最左邊的分組,但是示例都有下划線后面的數字,因此下划線似乎很重要。
編輯:
如果您真的只想替換第一個數字字符串而不參考下划線:
select regexp_replace(code, '[0-9]+', '', 1, 1)
from (select 'T_44B56T4' as code from dual union all select 'TE_2BMT' from dual ) t
您似乎必須使用標准字符串函數,因為您無法使用正則表達式函數。 (在 Gordon Linoff 的回答下發表評論;如果您在原始問題的底部添加相同的內容,並清楚地標記為EDIT ,這將有所幫助)。
此外,輸入似乎總是至少有一個下划線,並且必須刪除的任何數字都將始終緊跟在第一個下划線之后。
如果是這樣,這是您可以解決的一種方法:
select s, substr(s, 1, instr(s, '_')) ||
ltrim(substr(s, instr(s, '_') + 1), '0123456789') as result
from (
select 'T_44B56T4' s from dual union all
select 'TXM_1JK7B' from dual union all
select '34_AB3_1D' from dual
)
S RESULT
--------- ------------------
T_44B56T4 T_B56T4
TXM_1JK7B TXM_JK7B
34_AB3_1D 34_AB3_1D
我又添加了一個測試字符串,以表明只刪除緊跟在第一個下划線之后的數字; 任何其他數字保持不變。
請注意,此解決方案也很可能比正則表達式解決方案更快(假設這很重要;有時會,但通常不會)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.