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

How to output a pattern without including the beginning of the pattern?

我正在尝试从 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 作为我的输出。

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

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

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

您的数据与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 在线测试。