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

如何在SQL中使用正则表达式提取JSON列数据至对应字段

在SQL中从JSON字符串列提取指定字段值

正则表达式方案

不同数据库的正则函数语法略有差异,以下是针对主流数据库的实现:

MySQL

使用REGEXP_SUBSTR匹配并捕获目标值,再通过TRIM去除包裹的双引号:

SELECT 
  timestamp,
  name,
  TRIM('"' FROM REGEXP_SUBSTR(json_column, 'key1\s*:\s*"([^"]+)"', 1, 1, 'c', 1)) AS key1,
  TRIM('"' FROM REGEXP_SUBSTR(json_column, 'key2\s*:\s*"([^"]+)"', 1, 1, 'c', 1)) AS key2
FROM json_table;

正则说明:key1\s*:\s*"([^"]+)" 匹配key1及冒号前后的任意空格,捕获双引号内的非引号字符作为目标值。

PostgreSQL

可以用regexp_match或substring提取捕获组内容:

-- 方法1:regexp_match
SELECT 
  timestamp,
  name,
  (regexp_match(json_column, 'key1\s*:\s*"([^"]+)"'))[1] AS key1,
  (regexp_match(json_column, 'key2\s*:\s*"([^"]+)"'))[1] AS key2
FROM json_table;

-- 方法2:substring
SELECT 
  timestamp,
  name,
  substring(json_column FROM 'key1\s*:\s*"([^"]+)"') AS key1,
  substring(json_column FROM 'key2\s*:\s*"([^"]+)"') AS key2
FROM json_table;

SQL Server(2017+)

使用REGEXP_SUBSTRING提取捕获组,再去除双引号:

SELECT 
  timestamp,
  name,
  TRIM('"' FROM REGEXP_SUBSTRING(json_column, 'key1\s*:\s*"([^"]+)"', 1, 1, NULL, 1)) AS key1,
  TRIM('"' FROM REGEXP_SUBSTRING(json_column, 'key2\s*:\s*"([^"]+)"', 1, 1, NULL, 1)) AS key2
FROM json_table;

更可靠的原生JSON函数方案

正则处理JSON存在局限性(比如值包含转义双引号时会失效),推荐使用数据库原生的JSON解析函数,兼容性和稳定性更好:

MySQL

使用->>运算符直接提取字符串值:

SELECT 
  timestamp,
  name,
  json_column->>'$.key1' AS key1,
  json_column->>'$.key2' AS key2
FROM json_table;

PostgreSQL

先将字符串转为JSON类型,再用->>提取值:

SELECT 
  timestamp,
  name,
  json_column::json->>'key1' AS key1,
  json_column::json->>'key2' AS key2
FROM json_table;

SQL Server

使用JSON_VALUE函数提取指定路径的值:

SELECT 
  timestamp,
  name,
  JSON_VALUE(json_column, '$.key1') AS key1,
  JSON_VALUE(json_column, '$.key2') AS key2
FROM json_table;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:10:24