如何从oracle数据库中存储在一个单元格中的KeyValuePair数据中根据键获取值

问题描述 投票:0回答:1

假设我有一张这样的桌子

id name             address                     Doc
1  {1:mark,2:john}  {1:Home,2:Work,3:Club}      {NI:299,Pass:A159}
2  {1:Max,2:Mo}     {1:Home}                    {NI:300011}

我想要的是编写一个查询来根据键从单元格中选择一个值 例如

i want the value which has key = 2 in column named(Name) where id=1

所以它应该返回

john

等等。 那么我怎样才能在不使用子字符串的情况下做类似的事情呢?

sql json oracle key-value
1个回答
0
投票

假设您有有效的 json 值:

CREATE TABLE mytable (
  id int,
  name  VARCHAR2 (200) ,          
  address VARCHAR2 (200),                    
  Doc VARCHAR2 (200),
  CONSTRAINT ensure_json CHECK (name IS JSON)
);

insert into mytable 
select 1,  '{"1":"mark","2":"john"}', '{"1":"Home","2":"Work","3":"Club"}', '{"NI":299,"Pass":"A159"}' from dual union all
select 2,  '{"1":"Max","2":"Mo"}', '{"1":"Home"}', '{"NI":300011}' from dual

查询可以是:

select t.name."2"
from mytable t
where id = 1

演示在这里


如果无效 JSON 中只有键值对,则:

with cte as (
  select REGEXP_REPLACE(name,
                 '([a-zA-Z0-9-]+):([a-zA-Z0-9-]+)',
                 '"\1":"\2"') as name
  from mytable t
  where id = 1
)
select json_value(name, '$."2"')
from cte

演示在这里

© www.soinside.com 2019 - 2024. All rights reserved.