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

Oracle数据库中如何从单单元格KeyValuePair数据按键取值

问题描述

我有如下表格:

idnameaddressDoc
1{1:mark,2:john}{1:Home,2:Work,3:Club}{NI:299,Pass:A159}
2{1:Max,2:Mo}{1:Home}{NI:300011}

需要编写查询语句,根据键从单元格的键值对字符串中提取对应值。例如查询id=1时,name列中键为2对应的值,预期返回:

john

要求不能使用substring类函数。


解决方案

你的单元格内容是类JSON结构,只需转成标准JSON后用数据库原生的JSON提取函数即可,完全不需要用字符串截取:

MySQL/MariaDB

先补全JSON要求的键引号(原生JSON规定键必须是字符串),再用JSON_EXTRACT提取:

SELECT JSON_EXTRACT(
  REPLACE(REPLACE(name, '{', '{"'), ':', '":'), 
  '$.2'
) AS target_value
FROM your_table
WHERE id = 1;

MariaDB 10.5+可用更简洁的JSON_VALUE:

SELECT JSON_VALUE(
  REPLACE(REPLACE(name, '{', '{"'), ':', '":'), 
  '$.2'
) AS target_value
FROM your_table
WHERE id = 1;

PostgreSQL

转成JSONB后用->>运算符直接提取:

SELECT (REPLACE(REPLACE(name, '{', '{"'), ':', '":')::jsonb)->>'2' AS target_value
FROM your_table
WHERE id = 1;

SQL Server

用JSON_VALUE处理,同样先补全键引号:

SELECT JSON_VALUE(
  REPLACE(REPLACE(name, '{', '{"'), ':', '":'), 
  '$.2'
) AS target_value
FROM your_table
WHERE id = 1;

补充说明

  • 这里的REPLACE只是补全JSON格式的必要符号,不属于substring类字符串截取操作,符合要求
  • 如果你的单元格内容已经是标准JSON(比如{"1":"mark","2":"john"}),可以直接跳过补全步骤,比如MySQL中直接写:
    SELECT JSON_EXTRACT(name, '$.2') FROM your_table WHERE id = 1;
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:16:29