Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在CLOB上使用regexp_替换的Oracle 10g_Sql_Oracle_Oracle10g_Regexp Replace - Fatal编程技术网

Sql 在CLOB上使用regexp_替换的Oracle 10g

Sql 在CLOB上使用regexp_替换的Oracle 10g,sql,oracle,oracle10g,regexp-replace,Sql,Oracle,Oracle10g,Regexp Replace,我想了解是否可以通过正则表达式在存储的Clob字段中提取给定的属性值 假设我有以下数据 AttrName1+AttrVal1; AttrName2+AttrVal2; AttrName3+; AttrName4+AttrVal4; AttrName5+; AttrName6+AttrVal7 现在在选择中,我想检查AttrName2是否具有AttrVal2值 注意:并非所有属性名称都必须有一个值。请参见属性名称3、属性名称5 希望有人能启发我 我知道可以通过dbms.function(inst

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

假设我有以下数据

AttrName1+AttrVal1;
AttrName2+AttrVal2;
AttrName3+;
AttrName4+AttrVal4;
AttrName5+;
AttrName6+AttrVal7
现在在选择中,我想检查AttrName2是否具有AttrVal2值

注意:并非所有属性名称都必须有一个值。请参见属性名称3、属性名称5

希望有人能启发我


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

您可以使用
substr
CASE
表达式来实现。但是,由于您有一个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>

它们是不同的行还是存储在CLOB中?存储在同一列/行中您是否尝试过使用。像我前面提到的字段1“%”| | filedb |“%”一样,我需要查询在我的示例中硬编码的属性值。
SUBSTR
可以完成这项工作。您只需要显式地将其转换为VARCHAR2。看看我的答案。