我的数据库有一个列,其中包含一个JSON数组,如下所示:

WITH dataset AS (
    SELECT *
    FROM (VALUES 
        ('1', JSON'[{ "name" : "foo" }, { "name" : "bar" }]'),
        ('2', JSON'[{ "name" : "fizz" }, { "name" : "buzz" }]'),
        ('3', JSON'[{ "name" : "hello" }, { "name" : "world" }]')
    ) AS t(id, my_array)
)

我想从数组中的最后一个元素中 Select name属性:

result
bar
buzz
world

我可以很容易地 Select 第一个元素:

SELECT json_extract_scalar(my_array, '$[0].name') FROM dataset

这些try 对最后一个元素不起作用:

SELECT json_extract_scalar(my_array, '$[-1].name') FROM dataset

SELECT json_extract_scalar(my_array, '$[cardinality(json_parse(my_array)) - 1].name') FROM dataset

SELECT element_at(my_array, -1) FROM dataset

注意:我不能对JSON数组的长度做出任何假设.

推荐答案

除了你的回答之外.

  1. json_extract/json_extract_scalar可以处理相当有限的JSON路径查询子集,因此实现目标的一种方法是强制转换为array.注意事项:

    • 不需要json_extract,可以直接转换JSON类型,如果列是字符串类型,则在转换之前使用json_parse.
    • 您可以使用JSON作为目标类型,即array(json)array(map(varchar, json)),这在数组/JSON对象属性中混合内容的情况下很有用:
    SELECT element_at(CAST(my_array AS ARRAY(MAP(VARCHAR, JSON))), -1)['name']
    FROM dataset;
    
  2. Trino应该是Athena的基础,因为第三版有几个高级functions to use with JSON path,比如json_queryjson_value,可以在下面的情况下使用:

    SELECT json_value(json_format(my_array), 'lax $[last].name')
    FROM dataset;
    

Sql相关问答推荐

使用group by后我的平均输出不是我想要的

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

在SQL中创建一个计数器,根据BigQuery/SQL中的条件递归地添加行值

在Golang中管理数据库事务的简洁方法

有没有办法在每次计算每一行的数据时更新2个值?

连接特定行号

Oracle SQL-将结果列在单行中

如果元素包含通过SQL指定的字符串,则过滤掉数组元素

SQL:如何取上一年的平均值?

明细表中没有记录如何更新主表的值为0

获取分布在同一行的列中的出现次数

POSTGRES to_timestamp() 假定 UTC 字符串为本地时间

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

使用 SQL 计算一年中任意 3 个月期间的总成本

在where语句中使用CTE非常缓慢

为 sqlite 全文搜索 (fts) 创建触发器时出现虚拟表的不安全使用

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

在 BigQuery 数据集中查找表大小和占总数据集大小的百分比

根据开始/结束标记将 GROUP_ID 分配给行

SQL 中的问题与包含最大日期的记录连接