Redshift:如果元胞数组中存在值,则返回行

Myg*_*g0t 5 redshift

如何返回包含列元胞数组中特定值的行?

想象一下我们有一个像这样的表:

id    name    phone           values
1     Taylor  xxx.xxx.xxxx    [4,6,5]
2     John    yyy.yyy.yyyy    [1,5,2]
3     Peter   zzz.zzz.zzzz    [6,2,6]
Run Code Online (Sandbox Code Playgroud)

我需要创建一个 SQL 查询,该查询将返回数组中存在值“6”的行values。所以预期的输出是:

id    name    phone           values
1     Taylor  xxx.xxx.xxxx    [4,6,5]
3     Peter   zzz.zzz.zzzz    [6,2,6]
Run Code Online (Sandbox Code Playgroud)

我们正在 Redshift 中工作。json_extract_array_element_text('json_string', pos)因此,如果更容易的话,可以使用该功能的可能性。请注意,值数组的长度可能彼此不同。

Shi*_*mar 0

我会试一下 :

首先使用此查询查找values您的字段中最长数组的最大长度SampleTable

SELECT MAX(JSON_ARRAY_LENGTH(values)) FROM SampleTable;
Run Code Online (Sandbox Code Playgroud)

然后根据您从上面查询得到的结果使用以下格式创建一个视图(我假设最大大小输出为 2,索引从 0 开始,根据您提供的示例表数据):

CREATE VIEW seq_0_to_2 AS (
    SELECT 0 AS i UNION ALL
    SELECT 1 UNION ALL
    SELECT 2
);
Run Code Online (Sandbox Code Playgroud)

然后使用以下查询来获取所需的结果:

WITH exploded_array AS (
    SELECT id,name,phone, JSON_EXTRACT_ARRAY_ELEMENT_TEXT(values, seq.i) AS NewExtractedValues
    FROM SampleTable, seq_0_to_2 AS seq
    WHERE seq.i < JSON_ARRAY_LENGTH(values)
  )
SELECT *
FROM exploded_array
where NewExtractedValues = 6;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

灵感来自https://torsten.io/stdout/expanding-json-arrays-to-rows/