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

SQL JSON解析:如何根据值查找对应的键?

根据JSON值反向查找对应键的SQL实现

针对从JSON列中根据指定值找出对应键的需求,以下是几种主流数据库的实现方案:

PostgreSQL

利用json_each_text(或jsonb_each_text,对应jsonb类型列)将JSON键值对展开为行,再筛选匹配值的键:

-- 匹配值为["val3"]的情况
SELECT json_key
FROM my_table,
     json_each_text(my_col) AS j(json_key, json_value)
WHERE json_value = '["val3"]';

-- 匹配数组中包含val3的情况(更灵活)
SELECT json_key
FROM my_table,
     json_each(my_col) AS j(json_key, json_value)
WHERE 'val3' = ANY(json_value::text[]);

MySQL(8.0+)

通过JSON_TABLE将JSON键转为行,再逐个取值对比:

-- 匹配值为["val3"]的情况
SELECT j.key_name
FROM my_table,
     JSON_TABLE(
         JSON_KEYS(my_col),
         '$[*]' COLUMNS (key_name VARCHAR(255) PATH '$')
     ) AS j
WHERE JSON_VALUE(my_col, CONCAT('$.', j.key_name)) = '["val3"]';

-- 匹配数组中包含val3的情况
SELECT j.key_name
FROM my_table,
     JSON_TABLE(
         JSON_KEYS(my_col),
         '$[*]' COLUMNS (key_name VARCHAR(255) PATH '$')
     ) AS j
WHERE JSON_CONTAINS(my_col, '"val3"', CONCAT('$.', j.key_name));

SQL Server

使用OPENJSON解析JSON结构,按需展开数组后筛选:

-- 匹配值为["val3"]的情况
SELECT [key] AS json_key
FROM my_table
CROSS APPLY OPENJSON(my_col)
WHERE value = '["val3"]';

-- 匹配数组中包含val3的情况
SELECT j1.[key] AS json_key
FROM my_table
CROSS APPLY OPENJSON(my_col) AS j1
CROSS APPLY OPENJSON(j1.value) AS j2
WHERE j2.value = 'val3';

注意事项

  • 不同数据库的JSON函数语法差异较大,需根据实际使用的数据库选择对应语句。
  • 若JSON数组可能包含多个值,优先选择展开数组后匹配的写法,确保不会遗漏符合条件的键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:55:00