我正在try 从我的JSON列中解析出TEST-N-VALUE.我曾try 使用通配符,但此处创建的列仅返回NULL.

SELECT get_json_object('{"random_field": "ABC", "test-0-value":"1", "test-1-value":"2"}', '$.test-*-value');

有谁有任何关于如何从中提取这些动态对象的提示吗?预期结果将是..但请记住,输出必须允许动态数量的键值对.

extracted_out
-------------
{"test-0-value":"1", "test-1-value":"2"}

推荐答案

You can convert json to map using from_json, explode map to get key, value, filter only keys which you need,
collect array of key:value, concatenate array with comma delimiter, use str_to_map to get map containing keys which you need, then you can optionally convert it to JSON string using to_json

演示:

with src as (select '{"random_field": "ABC", "test-0-value":"1", "test-1-value":"2"}' as original_json)

select s.original_json, to_json( str_to_map(concat_ws(',',collect_list(concat(key,':',value))))) result
from src s
     lateral view  explode(from_json(s.original_json, 'map<STRING, STRING>'))  m as key, value
where key rlike 'test-\\d+-value'  
group by s.original_json
""").show(100, false)

结果:

+---------------------------------------------------------------+---------------------------------------+
|original_json                                                  |result                                 |
+---------------------------------------------------------------+---------------------------------------+
|{"random_field": "ABC", "test-0-value":"1", "test-1-value":"2"}|{"test-0-value":"1","test-1-value":"2"}|
+---------------------------------------------------------------+---------------------------------------+

最新情况:

使用MAP_FILTER找到更好的解决方案

spark.sql("""
with src as (select '{"random_field": "ABC", "test-0-value":"1", "test-1-value":"2"}' as original_json)

select s.original_json, to_json( map_filter(from_json(s.original_json, 'map<STRING, STRING>'), (k, v) -> k rlike 'test-\\d+-value')) result
from src s
""").show(100, false)

Sql相关问答推荐

查询将查找将标记设置为user2的用户

使用交叉应用透视表在SQL中转换分段时间段&

SQL更新,在2个额外的表上使用内部连接

对非RUST源代码字符串使用`stringify!`,例如SQL查询

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

从列中提取子字符串的ORDER BY CASE语句

如何实现同一列的递归计算?

SQL:查询作为子查询或CTE写入的最大和数失败

如何用HeidiSQL在Firebird中设置超时?

从单个表达式中的分隔字符串中取平均值

如何根据几个条件 Select 值:如果满足一个范围的SUM,则对另一个范围求和

SQL查询正在工作,但返回空结果

从给定数据中查找下一个工作日期

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

在 PostgreSQL 中使用 ltree 列进行累积

JSON_VALUE 不适用于提取的 json 中的嵌套路径

DB2 SQL查询结果多余数据

SQL Server: 将JSON对象数组转换为表格格式

As400 (IBM i) SQL 表 QSYS2.SYSTABLES 上的元数据

在 PostgreSQL 中,如何将数组中的每个元素用作另一个表中的键?