在我的配置单元表T中,字段A是json格式的字符串,并且A存储值{"c_e_i":"{\"e_c_f\":1}"}.

我想要c_e_i.\"e_c_f\"

所以我用了get_json_object(T.A, '$.c_e_i.\\"e_c_f\\"'),但它不起作用.我该怎么办?

我想要c_e_i.\"e_c_f\"

推荐答案

很简单,因为"{\"e_c_f\":1}"值是一个字符串,而不是JSON映射.整个事情不是Map<String:Map<String:String>>型的,而是Map<String:String>型的

Map<String:Map<String:String>>应该是这样的{"c_e_i":{"e_c_f":1}}

您可以像这样提取字符串值:

with T as (
select '{"c_e_i":"{\\\"e_c_f\\\":1}"}' as A 
)

select A as original_str, 
get_json_object(A, '$.c_e_i') as result
from T

结果:

original_str                  result    

{"c_e_i":"{\"e_c_f\":1}"}     {"e_c_f":1}

您可以看到,结果是正确的JSON映射-斜杠也被删除了,因为它们在提取和转换过程中被解释(在本例中是删除的),所以您可以从中提取e_c_f(应用两次get_json_Object):

with T as (
select '{"c_e_i":"{\\\"e_c_f\\\":1}"}' as A 
)

select A as original_str, 
get_json_object(get_json_object(A, '$.c_e_i'),'$.e_c_f') as result
from T

结果:

original_str                result  
{"c_e_i":"{\"e_c_f\":1}"}   1
    

或者删除原始JSON中多余的所有内容以使其正确JSON Map<String:Map<String:String>>,然后解压缩:

with T as (
select '{"c_e_i":"{\\\"e_c_f\\\":1}"}' as A 
)

select A as original_str, 
regexp_replace(regexp_replace(regexp_replace(A, '\\\\"','"'), '"\\{','\\{'),'"\\}','\\}') as correct_JSON, --remove slashes and remove doublequotes before { and after }  
get_json_object(regexp_replace(regexp_replace(regexp_replace(A, '\\\\"','"'), '"\\{','\\{'),'"\\}','\\}'), '$.c_e_i.e_c_f') as result

结果:

original_str                    correct_json           result   
{"c_e_i":"{\"e_c_f\":1}"}      {"c_e_i":{"e_c_f":1}}    1

Sql相关问答推荐

帮助修复查询以识别SQL DW中数据中的递归关系

如何在联接条件不匹配时按日期获取上一条记录

为什么在这种情况下我不能使用LAG函数?

在Oracle中,如何删除具有特定值的行,仅当它是重复的行?

缺少日期标识

两个月之间的WHERE CASE WHEN-ORA-00905:缺少关键字

为什么左联接结果在MS Access数据库中不匹配

向表中添加新列取决于表的日期列(unpivot)

根据时间值提取记录

SQL 查找 varchar 类型列及其值中多次出现的子字符串

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

snowflake中的动态文件名生成

条件前置值

为每组填写行以进行旋转

在 Microsoft SQL Server 中,如何只为特定值保留不同的行?

连续日期的SQL

按 15 分钟递增计数分组,包括 0 计数

使用 json_agg 从 SQL 查询获取 [null] 响应

聚合 Athena 中的列

遍历数据,计算每个月最后三天的总和