Oracle Regex 从字符串中的键值对中获取值

Oracle Regex grabbing value from key value pair in a string

考虑以下列行:

col
-------------------------
'{"day":"8","every":"2"}'

我正在尝试使用正则表达式从该字符串中获取 8 来确定日期。

到目前为止我有:

SELECT 
    regexp_replace(col, '{"day":[^0-9]', '') as "day"
FROM 
   mytable;

这给了我:

 day
 ---------------
 8","every":"2"}

我无法弄清楚如何从第一个数字向前过滤掉字符串的其余部分。在我的示例中,我只想要此行的数字 8。

这个怎么样?

SELECT 
    regexp_replace(col, '{"day":"([0-9]+).*', '') as "day"
FROM 
   mytable;

如果您有幸使用 Oracle 12c Release 1 (12.1.0.2) 或更高版本,请务必查看 JSON_VALUE

WITH t (s)
AS (
    SELECT '{"day":"8","every":"2"}'
    FROM DUAL
    )
SELECT JSON_VALUE(s, '$.day'  ) AS day
    ,  JSON_VALUE(s, '$.every') AS every
FROM t;

DAY   EVERY
---   -----
8     2

如果您无权访问 JSON_VALUE() 那么我会推荐以下正则表达式,除非您始终知道 JSON 字符串中 day 键的位置:

SELECT REGEXP_REPLACE(col, '^.*"day":"(\d+)".*$', '') AS day
  FROM mytable;

这会将整个字符串(假设它匹配!)替换为第一个捕获组的内容(括在括号中:(\d+))。 \d表示一个数字0-9。如果您还想 return NULL 值,可以将 \d+ 替换为 \d*。如果负数或非数字值是可能的,那么我会推荐以下内容:

SELECT REGEXP_REPLACE(col, '^.*"day":"([^"]*)".*$', '') AS day
  FROM mytable;

这将 return day 键中可能包含的任何字符。

仅供参考,一旦您获得数值,无论是数值还是非数值,您都可以使用 TO_NUMBER()REGEXP_SUBSTR():

将其安全地转换为数值
SELECT COALESCE( TO_NUMBER( REGEXP_SUBSTR( REGEXP_REPLACE( col, '^.*"day":"[^"]*".*$', '' ), '\d+' ) ), 0 ) AS day
  FROM mytable;

希望对您有所帮助。