我想了解是否可以通过正则表达式在存储的Clob字段中提取给定的属性值。
说我有以下数据。
AttrName1+AttrVal1;
AttrName2+AttrVal2;
AttrName3+;
AttrName4+AttrVal4;
AttrName5+;
AttrName6+AttrVal7
现在在选择中我想检查AttrName2是否具有值AttrVal2。
请注意,并非所有属性名称都必须具有值。请参阅AttrName3,AttrName 5
希望有人能够启发我。
我知道它可以通过dbms.function(instr,substr等)实现,但也许有更简单的方法。
答案 0 :(得分:1)
您可以使用SUBSTR
和CASE
表达式执行此操作。但是,由于您具有CLOB数据类型,因此需要将其显式CAST为VARCHAR2进行比较。
让我们说你的表看起来像:
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>