我有以下文字:
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
答案 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