我正在try 从presto中的JSON中提取字符串.下面是两个选项,用于在我转换为字符串之前提取数据的外观:

  1. JSON_EXTRACT(my_column, '$.my_column_extract')=["A::1","B::2","C::3","D::4"]
  2. JSON_EXTRACT(my_column, '$.my_column_extract')={"0":"A::1","1":"B::2","2":"C::3","3":"D::4.5"}

对于上述两个选项,我希望实现的目标字符串格式为: 对于1)A::1、B::2、C::3、D::4 2)A::1、B::2、C::3、D::4、5

所以我先转换为ARRAY(VARCHAR),然后转换为ARRAY_JOIN,以获得一个字符串.这对1)有效,但对2)无效.

  1. ARRAY_JOIN( 演员阵容( JSON_EXTRACT(MY_COLUMN,‘$.MY_COLUMN_EXTRACT’)AS数组(VARCHAR) ), ‘,’ )=A::1、B::2、C::3、D::4
  2. 相同的函数会导致格式错误.错误通知 (INVALID_CAST_ARGUMENT)不能强制转换为数组(Varchar).应为json数组,但得到了{"0":"A::1","1":"B::2","2":"C::3","3":"D::4,5"}

如何才能使2)生成目标字符串格式?

推荐答案

如果您的记录仅以这两种格式提供,则可以利用try_cast函数,该函数在无法执行强制转换时返回null,并将coalesce两种强制转换转换为第二种格式:

-- sample data
WITH dataset(my_column) AS (
 values ('{"my_column_extract":["A::1","B::2","C::3","D::4"]}'),
        ('{"my_column_extract":{"0":"A::1","1":"B::2","2":"C::3","3":"D::4,5"}}')
),

-- query parts
extracted as (
    select JSON_EXTRACT(my_column, '$.my_column_extract') extr
    from dataset)

SELECT coalesce(
        try_cast(extr as array(varchar)), -- try process array
        map_values(cast(extr as map(varchar, varchar)))) -- if not array - process json object as map and get map values
FROM extracted;

输出:

_col0
[A::1, B::2, C::3, D::4]
[A::1, B::2, C::3, D::4,5]

然后根据需要处理生成的数组

Sql相关问答推荐

Group By子句返回太多行

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

在SQL中返回缺省值,即使查询不返回任何结果

将两列相加为同一表中的行的查询

优化Postgres搜索未知长度的子串

TSQL如何为群分配号码

在WHERE EXISTS子查询中,列返回是否重要?

从JSON值数组创建扁平数组Athena

聚合内部的条件在哪里?

如何 for each id创建长度等于id长度的不同日期序列?

Postgres存在限制问题「小值」

COBOL\DB2作业(job)需要帮助?快来获取专业指导!

如何显示最常引用条目的详细信息

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

字符串从更改到表列和查询中的一行的转换错误

具有日期时间条件的存储过程

SQLite 中的过滤运行总和视图

如何使用 pg-promise 创建要在复杂的 sql 查询中使用的 VALUES 列表?

在 Athena / Presto 中提取 JSON 对象以获取动态密钥

当计数为 0 时显示行