web-dev-qa-db-ja.com

Oracleで文字列の右端10桁を取得する方法

OracleテーブルからIDを取得しようとしています。 TN0001234567890345のようなものです。私が欲しいのは、右端の10の位置に従って値をソートすることです(例:4567890345)。 Oracle 11gを使用しています。 Oracle SQLの右端の10桁をカットする機能はありますか?

前もって感謝します

ティスモン

25
tismon

[〜#〜] substr [〜#〜] 関数を次のように使用できます。

select substr('TN0001234567890345',-10) from dual;

出力:

4567890345
42
codaddict

codaddictのソリューションは、文字列が少なくともトリミングされる長さと同じであることがわかっている場合に機能します。ただし、短い文字列を使用できる場合(たとえば、最後の10文字にトリミングし、トリミングする文字列の1つが「abc」である場合)、nullが返されます。

したがって、ここにあるのは、長さに関係なく、右端の10文字が存在する限り、わずかに変更されたバージョンです。

select substr(colName, -least(length(colName), 10)) from tableName;
7
Briguy37

より退屈ですが、それを行う別の方法。以下に示すように、REVERSEおよびSUBSTR関数を使用します。

SELECT REVERSE(SUBSTR(REVERSE('TN0001234567890345'), 1, 10)) FROM DUAL;

最初のREVERSE関数は、文字列5430987654321000NTを返します。

SUBSTR関数は、新しい文字列5430987654321000NTを最初の文字から10番目の文字まで読み取り、5430987654を返します。

最後のREVERSE関数は、元の文字列から最初の8文字を引いたものを返します。つまり、4567890345

2
user3496712

ええ、これは古い投稿ですが、誰かが何らかの理由で編集したためにリストに表示され、正規表現ソリューションが含まれていないことにI然としました!したがって、無益性の演習のために、regex_substrをorder by句で使用するソリューションを次に示します。正規表現は、文字列の最後の10文字を調べます。

with tbl(str) as (
  select 'TN0001239567890345' from dual union
  select 'TN0001234567890345' from dual
)
select str
from tbl
order by to_number(regexp_substr(str, '.{10}$'));

文字列のID部分は少なくとも10桁であると仮定されます。

0
Gary_W