0

varchar2次のようなデータを含む列があります。アルファベット文字で始まり、1つまたは2つの数字、つまり、、のいずれかを持つことができる、カプセル....[A1]...[A2]... 化されたすべてのデータを取り出したい。[][B1][B23]

したがって、次のようなものが必要です。「WHERE列は'[__]' OR column is like '[___]'_アルファベットまたは数値以外の値ではありません。

そして、後で使用するためにそれらを何らかの方法で保存することは可能ですか?

4

2 に答える 2

1

REGEXP_LIKE正規表現に一致する値を見つけるために使用できます。

[...] WHERE REGEXP(col_name, '\[[A-Z][0-9]{1,2}\]');
于 2013-03-15T14:12:51.287 に答える
1

素晴らしい質問です!これは、一致を結果セットにクエリする方法を示すフィドルです。

そして、フィドルのクエリが意味をなさない場合の長い説明があります:)

RegEx_Test列という名前のテーブルを使用していますMyVal。表の内容は次のとおりです。

MyVal
------------------------------
[A1][abc][B23][D123]a33[bx5]
[Z15][ax0][B0][F13]R3
[X215][A3A][J99]F33F33G24[43][R3]
[Z99][c1][F3][d33]3x24[Y3][f13]
[9a][D41][Q39][XX12]B27[T03][J12]

全体を通しての正規表現は次のとおり\[[[:alpha:]][[:digit:]]{1,2}\]です。:alpha:これは、POSIXとインジケーターを除いて、他の回答と同じです。POSIXと:digit:インジケーターは、国​​際的なキャラクターセットの場合により安全です。

まず、任意の行の一致の最大数を知る必要があります。これに使用REGEXP_COUNTします:

SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
  FROM Regex_Test

MAX(REGEXP_COUNT(My...
----------------------
                     6

その最大カウントを使用して「カウンター」テーブル(SELECT ... FROM DUAL以下)を取得し、を使用して値をプルするクエリを使用してカウンターテーブルを相互結合しますREGEXP_SUBSTRREGEXP_SUBSTR「occurrence」パラメータがあり、:を使用しますCounter

SELECT
  MyVal,
  Counter,
  REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
FROM Regex_Test
CROSS JOIN (
   SELECT LEVEL Counter
   FROM DUAL
   CONNECT BY LEVEL <= (
     SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
     FROM Regex_Test)) Counters

これが私のテーブルに対する実行例です(部分的な結果):

MyVal                              Counter Matched
---------------------------------- ------- -------
[9a][D41][Q39][XX12]B27[T03][J12]        1 [D41]
[9a][D41][Q39][XX12]B27[T03][J12]        2 [Q39]
[9a][D41][Q39][XX12]B27[T03][J12]        3 [T03]
[9a][D41][Q39][XX12]B27[T03][J12]        4 [J12]
[9a][D41][Q39][XX12]B27[T03][J12]        5
[9a][D41][Q39][XX12]B27[T03][J12]        6
[A1][abc][B23][D123]a33[bx5]             1 [A1]
[A1][abc][B23][D123]a33[bx5]             2 [B23]
[A1][abc][B23][D123]a33[bx5]             3
... and so on - total is 30 rows

この時点で、個々の一致の結果セットに加えて、行の一致が最大数より少ない場合のnullがあります。試合にはまだ周囲の括弧があります。nullを除外して角かっこを削除する外部クエリで全体を囲み、最終的なリストを作成します。

SELECT SUBSTR(Matched, 2, LENGTH(Matched)-2) FROM (
  SELECT
    MyVal,
    Counter,
    REGEXP_SUBSTR(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]', 1, Counter) Matched
  FROM Regex_Test
  CROSS JOIN (
     SELECT LEVEL Counter
     FROM DUAL
     CONNECT BY LEVEL <= (
       SELECT MAX(REGEXP_COUNT(MyVal, '\[[[:alpha:]][[:digit:]]{1,2}\]'))
       FROM Regex_Test)) Counters
) WHERE Matched IS NOT NULL

これはFiddleにあるクエリであり、別のクエリで使用できます。

于 2013-03-15T16:24:29.230 に答える