【问题标题】:Extract specific key from array of jsons in Amazon Redshift从 Amazon Redshift 中的 json 数组中提取特定键
【发布时间】:2021-06-20 18:52:22
【问题描述】:

背景

我正在使用 SQL 在 Amazon Redshift 数据库中工作。我有一个表,其中一个名为 attributes 的列包含如下所示的数据:

[{"name": "Color", "value": "Beige"},{"name":"Size", "value":Small"}]

[{"name": "Size", "value": "Small"},{"name": "Color", "value": "Blue"},{"name": "Material", "value": "Cotton"}]

据我了解,以上是JSON字符串中的一系列路径元素。

问题

我希望提取每个 JSON 字符串中的颜色值。我不确定如何进行。我知道如果颜色在同一个位置,我可以使用索引来指示从哪里提取。但这里不是这样。

我尝试了什么

select json_extract_array_element_text(attributes, 1) as color_value, json_extract_path_text(color_value, 'value') as color from my_table

此查询适用于某些列,但并非所有列,因为颜色值的位置不同。

我很感激这里的任何帮助,因为我对 sql 非常陌生,并且只进行了基本的查询。我一直使用以下page作为参考

【问题讨论】:

标签: sql amazon-web-services amazon-redshift


【解决方案1】:

首先,您的数据是数组格式(在 [ ] 之间),而不是对象格式(在 { } 之间)。您提到的页面是用于从 JSON 对象而非数组中提取数据的函数。数组格式也带来了挑战,因为您需要知道要提取的元素的数字位置。

根据您的示例数据,对象似乎是要走的路。如果是这样,您将希望重新格式化您的数据,使其更像:

{"Color": "Beige", "Size": "Small"}

{"Size": "Small", "Color": "Blue", "Material": "Cotton"}

仅当“名称”值在您的数据中是唯一的时,此转换才有效。

有了这个你选择的函数 - JSON_EXTRACT_PATH_TEXT() - 将从数据中提取你想要的值。

现在更改数据可能不是一种选择,处理这些数组会使事情变得更加困难和性能降低。为此,您需要通过与一组数字交叉连接来扩展这些数组,这些数字包含数组最大长度内的所有数字。例如,对于您提供的示例,您需要通过值 0、1、2 进行交叉连接,以便可以完全提取 3 元素数组。然后,您可以只过滤那些“名称”为“颜色”的行。

从数组中提取元素所需的函数是 JSON_EXTRACT_ARRAY_ELEMENT_TEXT(),由于数组中存储有对象,因此需要对结果运行 JSON_EXTRACT_PATH_TEXT()。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 2022-08-24
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多