从文本regexp_substs中删除第二个引号

时间:2018-03-19 12:38:33

标签: sql oracle

我有以下文字:

 PL/SQL: ORA-00904: "TFSE"."PRODUCT_C": invalid identifier

我想获得值PRODUCT_C,但我得到的是TFSE

这是我的查询,通常文字是ora-00904 PRODUCT_C,所以下面的内容正常。

select  regexp_substr('PL/SQL: ORA-00904: "TFSE"."PRODUCT_C": invalid identifier', '[^"]+', 1, 2) from dual

编辑:

有时我的信息会像这样

PL/SQL: ORA-00904: "PRODUCT_C": invalid identifier 或者像这样

PL/SQL: ORA-00904: "TFSE"."PRODUCT_C": invalid identifier

如何调整regex_substr以获得结果`

PRODUCT_C

2 个答案:

答案 0 :(得分:2)

关闭,但没有雪茄,嗯?

SQL> select  regexp_substr('PL/SQL: ORA-00904: "TFSE"."PRODUCT_C": invalid identifier', '[^"]+', 1, 4) from dual;

REGEXP_SU
---------
PRODUCT_C

[编辑,阅读评论后]

SQL> with test as (select 'PL/SQL: ORA-00904: "PRODUCT_C": invalid identifier' col from dual union
  2                select 'PL/SQL: ORA-00904: "TFSE"."PRODUCT_C": invalid identifier' from dual
  3               )
  4  select col,
  5    regexp_substr(col, '[^"]+', 1, regexp_count(col, '"')) result
  6  from test;

COL                                                       RESULT
--------------------------------------------------------- ---------------
PL/SQL: ORA-00904: "PRODUCT_C": invalid identifier        PRODUCT_C
PL/SQL: ORA-00904: "TFSE"."PRODUCT_C": invalid identifier PRODUCT_C

SQL>

答案 1 :(得分:2)

我建议你首先提取用冒号分隔的第三个模式,然后搜索双引号之间的最后一个模式。

这会添加另一层检查,以确保在提取带引号的字符串之前从错误消息中选择正确的元素。

SELECT
   regexp_substr( regexp_substr ( s, '[^:]+', 1, 3) , '"([^"]+)"$', 1, 1, NULL, 1) v 
FROM
   yourtable t

SQL Fiddle