簡體   English   中英

如何從 Oracle SQL 中的字符串中刪除最左邊的一組數字?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM