如何在不包含模式开头的情况下输出模式?

时间:2019-05-31 17:10:45

标签: sql regex oracle-sqldeveloper regex-group

我正在尝试从Orcale的CLOB中提取两个字符。例如,CLOB列如下所示:

"rateArea":"KCMO","state":"MO","addressComponent":null,"msag":null

我写道:

 SELECT
 REGEXP_SUBSTR( ORD_DETAILS,  'state":"+\w\w' ) state
 from order_log

这给了我输出-state":"MO

我只想将MO作为输出。

您能建议所需输出的正则表达式代码吗?

2 个答案:

答案 0 :(得分:1)

使用捕获组。 REGEXP_SUBSTR()使用一个可选参数来指定要提取整个匹配项的组。

SELECT REGEXP_SUBSTR( ORD_DETAILS,  'state":"+(\w\w)', 1, 1, NULL, 1) state
FROM order_log

答案 1 :(得分:0)

您的数据与JSON非常相似,如果您的Oracle数据库版本为12c或更高版本,则可以尝试使用JSON_TABLE函数:

SELECT jt.state
FROM order_log ol
CROSS JOIN json_table(
  '{'||ol.ord_details||'}', '$'
  COLUMNS (
    rate_area VARCHAR2(30) PATH '$.rateArea',
    state VARCHAR2(5) PATH '$.state',
    addr_comp VARCHAR2(100) PATH '$.addressComponent',
    msag VARCHAR2(100) PATH '$.msag'
  )
) jt;

输出:

STATE
-----
MO

使用db<>fiddle在线进行测试。