【问题标题】:Oracle 10g using regexp_replace on a CLOBOracle 10g 在 CLOB 上使用 regexp_replace
【发布时间】:2015-06-15 20:24:25
【问题描述】:

我想了解是否可以通过正则表达式在存储的 Clob 字段中提取给定的属性值。

假设我有以下数据。

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

现在在选择中,我想检查 AttrName2 是否具有值 AttrVal2。

请注意,并非所有属性名称都必须具有值。参见 AttrName3、AttrName 5

希望有人能启发我。

我知道这可以通过 dbms.function(instr、substr 等)实现,但也许有更简单的方法。

【问题讨论】:

  • 它们是不同的行还是一起存储在 CLOB 中?
  • 一起存储在同一列/行中
  • 你试过用吗。 like field1 like '%'||filedb|'%'
  • 正如我提到的,我需要查询在我的示例中硬编码的属性值。
  • SUBSTR 会完成这项工作。您只需要将其显式转换为 VARCHAR2。看我的回答。

标签: sql oracle oracle10g regexp-replace


【解决方案1】:

您可以使用SUBSTRCASE 表达式来实现。但是,由于您有一个 CLOB 数据类型,您需要将其显式转换为 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>

【讨论】:

    猜你喜欢
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多