【问题标题】:Unlist an array in amazon redshift在亚马逊红移中取消列出数组
【发布时间】:2021-04-02 20:27:35
【问题描述】:

我有一个表,其中包含这样的列表:

id
[1,2,3,10]
[1]
[2,3,4,9]

我想要的结果是一个带有未列出值的表格,如下所示:

id2
1
2
3
10
1
2
3
4
9

我尝试了在网上找到的不同解决方案,aws documentationSO solutionblog post,但没有任何运气,因为我在列中有一个列表而不是 json 对象。 任何帮助表示赞赏!

【问题讨论】:

  • 该列的数据类型是什么?
  • @GMB 如何在 redshift 中看到?
  • 你尝试过 unnest(ARRAY[...]) 吗?
  • @ecp 是的,例如只是为了看看它是否有效,我尝试了SELECT unnest(ARRAY[1,2]),它抛出了一个错误:org.postgresql.util.PSQLException: ERROR: syntax error at or near "unnest" Position: 78
  • @Makaroni 。 . . Redshift 不支持数组。因此,这个问题没有任何意义,您需要解释一下列类型是什么。

标签: sql arrays amazon-redshift unnest


【解决方案1】:

该列的数据类型是什么?

Redshift 不支持数组,所以我假设这是一个 JSON 字符串。

Redshift 不提供 JSON 集合返回函数:我们需要手动取消嵌套。这是一种方法,如果您有一个包含足够行数的表(至少与数组中的元素一样多) - 比如说sometable

select json_extract_array_element_text(t.id, n.rn) as new_id
from mytable t
inner join (select row_number() over() - 1 as rn from sometable) n
    on n.rn < json_array_length(t.id)

【讨论】:

  • 如果列类型不是 json 而是 VARCHAR,是否可以构造类似的东西? '[1,2,3...]' 用逗号分隔?也许我们可以使用split_part 代替 json_extract_array_element_text。 split_part(t.id, ',', n.rn) 并更改 json_array_length 以获取 varchar 列中的元素数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2013-05-26
  • 2021-05-05
  • 1970-01-01
相关资源
最近更新 更多