首页 > 解决方案 > 使用 SQL Developer,我只想在特定字符之后显示字符串中的数字

问题描述

我正在使用 SQL Developer(它必须与 SQL Developer 一起使用),我需要获取一个看起来像 XML 数据的字符串,但它实际上只是一个字符串并将数据显示到一个表中。数据来自一个大表,其中一些用户 ID 中没有数字,一些工作 ID 中没有数字,但类似 ​​XML 的标签仍然存在。同样,它不是只是让 XML 看起来像 XML,因此没有 XML 命令可以工作。

数据:

<UserId>1234567</UserId><JobId>1234567890123</JobId><Date>Wed May 09 13:08:24 EDT 2018</Date>

这是我到目前为止所拥有的:

select company_id, location_id, 
    regexp_substr(xml_provision_responses,'UserId>([[:digit:]]+<?)') as USER_Id,
    regexp_substr(xml_provision_responses,'UserPitId>([[:digit:]]+<?)') as JOB_ID
From Entitymgr.Cr_Response_Matrix
Where CAST(regexp_replace(SUBSTR(xml_provision_responses,-24,4), '[^0-9]','')as varchar(20))='2018' 
    and company_Id = 9876543 and location_Id = 9876543210987;

第一个 Where 条件只是将数据拉取限制在今年,第二个 Where 条件只是添加到仅关注一个数据点,因此该部分无关紧要。

预期输出:

COMPANY_ID: 9876543

LOCATION_Id:9876543210987

用户 ID:1234567

JOB_ID:1234567890123

=========================================

实际输出:

COMPANY_ID: 9876543

LOCATION_Id:9876543210987

USER_ID:用户ID>1234567<

JOB_ID: JobId>1234567890123<

=========================================

我只想显示 > < 标签之间的字符串的数字部分。如果标签之间没有数字,则将 null 或缺少的单词放入该特定列的表中。

标签: sqloracleoracle-sqldeveloper

解决方案


您需要使用更多参数regexp_substr

select regexp_substr(xml_provision_responses, '(<JobId>)(.*)(</JobId>)', 1, 1, 'i', 2),
       regexp_substr(xml_provision_responses, '(<UserId>)(.*)(</UserId>)', 1, 1, 'i', 2)
...

这个想法是将匹配字符串分成3部分:

  • 标签开头 ( (<UserId>))
  • 内容 ( (.*))
  • 标签闭包 ( (</UserId>))

然后只获取第二个匹配的子表达式(参见2函数调用中的参数。


推荐阅读