【问题标题】:Presto SQL WHERE filter for a column that contains an array of structsPresto SQL WHERE 筛选包含结构数组的列
【发布时间】:2021-02-17 02:40:33
【问题描述】:

在下表中,我想过滤所有包含名称 Alice 的行。

WITH data AS (
   SELECT  ARRAY[CAST(ROW('Bob') AS ROW(name VARCHAR))] AS users
   UNION ALL 
   SELECT  ARRAY[CAST(ROW('Alice') AS ROW(name VARCHAR))] AS users
)
SELECT * 
FROM data

+-----------------------------------------------------------------+
| users                                                           |
+-----------------------------------------------------------------+
| [{name=Bob}]                                                    |
| [{name=Alice}]                                                  |
+-----------------------------------------------------------------+

如果用户是一个字符串,我可以说:

SELECT * from data where users like '%Alice%'

但 users 是一个结构数组。 array<struct<name:string>>

我正在Amazon AWS Athena which uses Presto 0.172 上执行查询。

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    您可以使用其中一种数组处理函数来选择相关行。 any_match 如果数组中的任何元素与给定条件匹配,则返回 true:

    SELECT * 
    FROM data
    WHERE any_match(users, user -> user.name = 'Alice')
    

    请注意,涉及CROSS JOINUNNEST 的答案仅在每个数组包含一个用户时才有效。

    【讨论】:

    • 我使用的 Presto 版本没有 any_match。但是,我发现了这个:github.com/prestosql/presto/issues/1036 并且,我将其更改为:WHERE contains(transform(users, user -> user.name = 'Alice'), true); 有效。 :)
    【解决方案2】:

    类似这样的:

    select t.*
    from t cross join
         unnest(t.users) u(user)
    where user.name = 'Alice';
    

    我不确定“结构”是什么样的。也许你只是想要:

    where user like '%Alice%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-08
      • 2020-11-26
      • 2018-12-05
      • 2020-06-29
      • 1970-01-01
      • 2019-11-25
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多