oracleで正規表現関数でカンマで区切られたフィールドを処理する


このテーマは確かに書きにくいですが、実際の意味はシーンに基づいています.
たとえばoracleのテーブルには2つのフィールドがあります
A1 B1
1 A,B,C,D,
2 E,F
現在の需要がある場合、A 1のレコードごとにどれだけの数のB 1を持っているかを統計します.例えば、
A 1=1の場合、そのB 1のフィールドには4つカンマで区切られているので、数は4、A 1=2のものがあり、
E,Fは2個で,すべての数は2である.
ORACLEでは、ORACLE自体の関数を使えば、実はこれもできます.
効果的なのは、これらのカンマで区切られた文字を1つずつ取り外して1行にすることです.上の例では、
何とかして
A1 B1
1 A
1 B
1 C
1 D
2 E
2 F
読者はすぐに、これは実際には多関連関係のデータベースストレージ方法であり、最もよく使われていることを考えているかもしれません.
しかし、A、B、C、Dのような方法でも一対多の関係を保存することができ、二つの間で変換することができます.
Oracleでは2つの方法で実装されています.
1)oracleでの正規表現の関数REGEXP_SUBSTR
oracleでのREGEXP_SUBSTRの使い方は、まず以下のように紹介します.
5パラメータ
1つ目は入力された文字列です
2つ目は正規表現です
3つ目は、いくつかの文字から正規表現の一致を識別することです.(デフォルトは1)
4つ目は、いくつかのマッチンググループを識別することです.(デフォルトは1)
5つ目は値範囲です.
i:大文字と小文字が敏感ではない;
c:大文字と小文字が敏感である;
n:時です.改行記号が一致しません.
m:マルチラインモード;
x:拡張モードで、正規表現の空白文字を無視します.
すべてのテストデータ
SQL> select * from test_reg_substr;
A
-----------------------------------
ABC123XYZ
ABC123XYZ456
Edward
中間の数値を取得
SQL> SELECT
2 REGEXP_SUBSTR(a,'[0-9]+')
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '[0-9]+');
REGEXP_SUBSTR(A,'[0-9]+')
---------------------------------
123
123
中間の数字を取得します(最初のアルファベットから一致し、2番目の一致項目を探します)
SQL> SELECT
2 NVL(REGEXP_SUBSTR(a,'[0-9]+',1, 2), '-') AS a
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '[0-9]+');
A
------------------------------------------------------
-
456
文字セットの取得
SQL> SELECT
2 REGEXP_SUBSTR(a, '\w+')
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '\w+');
REGEXP_SUBSTR(A,'\W+')
-------------------------------
ABC123XYZ
ABC123XYZ456
Name
「文字セット」を取得します(最初の文字から一致し、2番目の一致項目を探します)
SQL> SELECT
2 NVL(REGEXP_SUBSTR(a, '\w+',1, 2), '-') AS a
3 FROM
4 test_reg_substr
5 WHERE
6 REGEXP_LIKE(a, '\w+');
A
---------------------------------------------------
-
-
Edward
これについてもっと紹介して、見てもいいです.
http://topmanopensource.iteye.com/blog/1198638
この文の結び目は,結び目がいい.しかし、10 G以上でサポートされていることに注意してください.
方法1)上記の正則を用い,文は

SELECT distinct A1, REGEXP_SUBSTR(B1, '[^,]+', 1, LEVEL) AS A2
FROM TEST
CONNECT BY LEVEL <= LENGTH(B1)-LENGTH(REPLACE(B1, ','))+1)


方法2)
select a1, substr(b1, 0, instr(b1, ',')) from
test union select a1, substr(b1, instr(b1, ',')+1,length(b1))
from test
方法3
SQLを使用して、まずb 1フィールドの後ろにカンマを追加します.たとえば、
レコードのB 1のフィールドの内容を'duan,shao,chu,tian'にする
SELECT L_COUNT,
SUBSTR('duan,shao,chu,tian' || ',',
INSTR('duan,shao,chu,tian' || ',',
',',
L_COUNT - 1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) + 1,
INSTR('duan,shao,chu,tian' || ',',
',',
1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1) + 1) -
INSTR('duan,shao,chu,tian' || ',',
',',
1,
DECODE(L_COUNT - 1, 0, 1, L_COUNT - 1)) - 1) AS RS
FROM DUAL,
(SELECT LEVEL L_COUNT
FROM DUAL
CONNECT BY LEVEL <
LENGTH('duan,shao,chu,tian' || ',') -
LENGTH(REPLACE('duan,shao,chu,tian' || ',', ',', '')) + 1);
このうち2,3メソッドはoracle 9 iにも使用可能である