2013-07-30 157 views
2

我有一個查詢的結果,我應該得到一個列的最後位數說「術語」使用Oracle SQL SUBSTR獲得最後的數字

The value of column term can be like: 
'term'  'number' (output) 
--------------------------- 
xyz012   12 
xyz112   112 
xyz1   1 
xyz02   2 
xyz002   2 
xyz88   88 

注:並非僅限於上述情況的,但要求是過去3名或更少的字符可以是數字

功能我用:to_number(substr(term.name,-3)) (起初我以爲的要求作爲最後3個字符總是數字,但我錯了)

我使用TO_NUMBER因爲如果最後3位是 '012',那麼數量應該是 '12' 但作爲一個可以在某些特定的情況下,像 'xyz88', 'XYZ1' 見)將給予

ORA-01722:無效數字

如何使用substr或regexp_substr來實現此目的?

沒有探索regexp_substr多。

回答

7

使用REGEXP_SUBSTR

select column_name, to_number(regexp_substr(column_name,'\d+$')) 
from table_name; 
  • \ d匹配數字。與+一起,它成爲一個或多個數字的組。
  • $匹配行尾。
  • 把它放在一起,這個正則表達式在一個字符串的末尾提取一組數字。

更多詳細信息here

演示here

+0

Thx。 它的作品,但只是好奇regEx'\ d + $'做什麼。 首先接受了解決方案的人的回答。 – user1933888

+1

Thx,你搖滾! Your's是最優雅的解決方案。 – user1933888

+1

您應該接受此答案 –

1

甲骨文所具有的功能regexp_instr()這你想要做什麼:

select term, cast(substr(term, 1-regexp_instr(reverse(term),'[^0-9]')) as int) as number 
+0

Thx。這對我有用。 儘管我有一個問題:使用'cast as int'而不是to_number的優點,兩者在這種情況下都是相同的。 因此,基本上你反向字符串找到第一個非數字編號的位置,即1- 以得到substr的最後一位的數字,cool – user1933888

+0

@ user1933888。 。 。我不認爲有什麼區別。我傾向於使用ANSI標準結構(跨數據庫工作),但Oracle語言將是'to_number()'。 –

+0

好的,thx爲解釋你們是超級酷。 雖然在道德困境天氣接受你的答案或'蘭布林'人的',因爲他的解決方案看起來更優雅。 – user1933888

-1
select SUBSTRING(acc_no,len(acc_no)-1,len(acc_no)) from table_name; 
+1

看起來不處理多個數字。 –

+1

@Tordek當答案很明顯地提供了答案時,這怎麼能不能提供問題的答案? –

+4

僅有代碼的答案被自動標記爲低質量,因此在計算器上不鼓勵。將來,請詳細說明您的答案,並解釋爲什麼這是問題的解決方案。這有助於其他用戶。 –