1

クエリで長さが可変の混合英数字の文字列から特定の数値を抽出しようとしています。その数値に基づいて範囲を計算するには、これが必要です。オラクルを使用しています。

例:

D-3-J32P232

- 少なくとも J32 を取得する必要があり、おそらくそのストリングの 32 も取得する必要があります。この数値の範囲は、いつでも変更できます。

次の範囲の可能性があります。

D-3-J1P232D-3-J322P2342

2 番目と 3 番目の文字の後の数字は、任意の長さにすることができます。これを行う方法はありますか?

4

3 に答える 3

3

これはより単純で、範囲の両方の数値を取得します

select  substr( REGEXP_SUBSTR('D-3-J322P2342','[A-Z][0-9]+',1,1),2),
             substr( REGEXP_SUBSTR('D-3-J322P2342','[A-Z][0-9]+',1,2),2)
from dual
于 2011-06-29T05:43:19.590 に答える
2

REGEXP_SUBSTRは動作する可能性があります (11g バージョン):

SELECT REGEXP_SUBSTR('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)(\d+)',1,1,'i',2) num
  FROM dual;

サンプル データのテスト:

SQL> SELECT REGEXP_SUBSTR('D-3-J322P2342',''([A-Z]+-\d+-[A-Z]+)(\d+)',1,1,'i',2) num
  2    FROM dual;

NUM
---
322

SQL>

これは、大文字と小文字を問わない英字文字列、ダッシュ、1 つ以上の数字、ダッシュ、大文字と小文字を問わない別の英字文字列、そして対象の数字を受け入れます。

10g REGEXP_REPLAC Eでは、11g まで部分式を参照する機能が追加されなかったため、少し単純ではありません。

SELECT REGEXP_SUBSTR(str,'\d+',1,1) NUM
  FROM (SELECT REGEXP_REPLACE('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)','',1,1,'i') str
          FROM dual);

サンプルデータ:

SQL> SELECT REGEXP_SUBSTR(str,'\d+',1,1) NUM
  2    FROM 
       (SELECT REGEXP_REPLACE('D-3-J322P2342','([A-Z]+-\d+-[A-Z]+)','',1,1,'i') str
  3       FROM dual);

NUM
---
322
于 2011-06-29T00:19:39.457 に答える
1

REGEXP_SUBSTRは仕事をします

于 2011-06-29T00:19:07.017 に答える