You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Oracle正则表达式从JSON格式字符串提取day字段数值

解决从JSON字符串中提取day字段数值的问题

你的问题在于当前的regexp_replace只替换了{"day":[^0-9]这部分内容,但没处理数值后面的多余字符。其实有两种更可靠的方法来解决这个问题:

方法一:用JSON函数提取(推荐)

既然你的字段内容是标准JSON格式,直接用数据库的JSON解析函数会比正则更稳定——不用担心JSON格式的小变化(比如字段顺序调整、空格差异)。

比如在PostgreSQL中,可以这样写:

SELECT (col::json)->>'day' AS "day" FROM mytable;

如果是MySQL,写法是:

SELECT JSON_UNQUOTE(JSON_EXTRACT(col, '$.day')) AS `day` FROM mytable;

不管JSON里其他字段怎么变,这种方式都能准确拿到day对应的数值。

方法二:修正正则表达式

如果你一定要用正则的话,需要匹配day字段的完整取值部分,精准提取数字:

用regexp_substr直接捕获数字(更直观)

以PostgreSQL为例:

SELECT regexp_substr(col, '"day":"(\d+)"', 1, 1, 'g', 1) AS "day" FROM mytable;

参数解释:

  • "day":"(\d+)":匹配"day":"后的一串数字,(\d+)是专门用来提取数字的捕获组
  • 最后一个参数1表示取第一个捕获组的内容

MySQL的写法类似:

SELECT REGEXP_SUBSTR(col, '"day":"([0-9]+)"', 1, 1, 'c', 1) AS `day` FROM mytable;

用regexp_replace替换掉所有多余内容

也可以通过替换整个字符串,只保留目标数字:

SELECT regexp_replace(col, '.*"day":"(\d+)".*', '\1') AS "day" FROM mytable;

这个正则的逻辑是:匹配整个字符串,仅保留"day":"和"之间的数字部分,用\1引用捕获到的数字内容。

这样就能只拿到你想要的8了。

内容的提问来源于stack exchange,提问作者myhouse

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:40:24