Presto SQL WHERE 筛选包含结构数组的列

Presto SQL WHERE filter for a column that contains an array of structs

在下面的 table 中,我想筛选包含姓名 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是一个struct数组。 array<struct<name:string>>

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

像这样:

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

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

where user like '%Alice%'

您可以使用 array-processing 函数之一 select 相关行。 any_match returns 如果数组中的任何元素符合给定条件,则为真:

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

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