如何用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
相关产品推荐
相关产品推荐

