2

正規表現を使用して、保存された Clob フィールドの特定の属性値を抽出できるかどうかを知りたいです。

次のデータがあるとします。

AttrName1+AttrVal1;
AttrName2+AttrVal2;
AttrName3+;
AttrName4+AttrVal4;
AttrName5+;
AttrName6+AttrVal7

Select で、AttrName2 の値が AttrVal2 であるかどうかを確認したいと思います。

すべての属性名に必ずしも値があるわけではないことに注意してください。AttrName3、AttrName 5 を参照

誰かが私を啓発できることを願っています。

dbms.function (instr、substr など) を介して達成できることはわかっていますが、もっと簡単な方法があるかもしれません。

4

1 に答える 1

1

SUBSTRandCASE式を使用して実行できます。ただし、CLOB データ型があるため、比較するには VARCHAR2 として明示的に CAST する必要があります。

テーブルが次のようになっているとします。

SQL> CREATE TABLE t(str CLOB);

Table created.

SQL>
SQL> INSERT ALL
  2  INTO t VALUES('A1+A1')
  3  INTO t VALUES('A2+B2')
  4  INTO t VALUES('A3+')
  5  INTO t VALUES('A4+A4')
  6  INTO t VALUES('A5+')
  7  INTO t VALUES('A6+B7')
  8  SELECT * FROM dual;

6 rows created.

SQL>
SQL> COMMIT;

Commit complete.

SQL>
SQL> SELECT * FROM t;

STR
-----
A1+A1
A2+B2
A3+
A4+A4
A5+
A6+B7

6 rows selected.

SQL>

これで、次のようにCLOB列を比較できます。

SQL> WITH DATA AS(
  2  SELECT str,
  3         CAST(SUBSTR(str, 1, instr(str, '+', 1) -1) AS VARCHAR2(30)) attr1,
  4         CAST(SUBSTR(str, instr(str, '+', -1) +1) AS VARCHAR2(30)) attr2
  5  FROM t
  6  )
  7  SELECT str,
  8    attr1,
  9    attr2,
 10    CASE
 11      WHEN attr1 = attr2
 12      THEN 'Value matches'
 13      ELSE 'Not mathing'
 14    END val
 15  FROM DATA
 16  /

STR   ATTR1 ATTR2 VAL
----- ----- ----- -------------
A1+A1 A1    A1    Value matches
A2+B2 A2    B2    Not mathing
A3+   A3          Not mathing
A4+A4 A4    A4    Value matches
A5+   A5          Not mathing
A6+B7 A6    B7    Not mathing

6 rows selected.

SQL>
于 2015-04-10T09:01:39.823 に答える