You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by James Taylor <ja...@apache.org> on 2019/04/17 00:08:27 UTC
support for array subquery expression?
Hello SQL experts,
Does Calcite support the ARRAY subquery expression[1]? It looks liked based
on SqlArrayQueryConstructor, it does [2]? Do folks know if this is standard
SQL and supported in very many databases?
The use case is to simplify queries that process arrays. Instead of doing a
cross join, you can use the ARRAY function on a subquery. For example, you
can do this:
select d.id,
ARRAY(SELECT STRUCT(
date_trunc('day',s.timestamp) as occurred_at,
s.user_id,
s.path_id,
s.accepted_source
)
FROM UNNEST(ARRAY_CONCAT(
previous_states,
current_state) s
) AS all_states
FROM my_data d
instead of this:
WITH arrayed_data AS (
SELECT d.created_at, d.id,
ARRAY_CONCAT(d.previous_states,
current_state) as accepted
FROM my_data d
)
select all_a.id,
ARRAY_AGG(CAST(ROW(
date_trunc('day',a.timestamp),
a.user_id,
a.path_id,
a.accept_source
) as ROW(occurred_at TIMESTAMP,
id varchar,
path_id varchar,
accept_source varchar)))
FROM arrayed_data as all_a
CROSS JOIN UNNEST(all_a.accepted) AS a
GROUP BY all_a.id
Thanks,
James
[1]
https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions
[2]
https://calcite.apache.org/apidocs/org/apache/calcite/sql/fun/SqlArrayQueryConstructor.html
Re: support for array subquery expression?
Posted by Julian Hyde <jh...@apache.org>.
i believe that "ARRAY(subquery)” is standard SQL. My friend John Sichi wrote a very readable guide to standard SQL collection types[1] a few years ago (when the ancestral code of Calcite was part of the Farrago project), and ARRAY(subquery) is in there.
Julian
[1] http://farrago.sourceforge.net/design/CollectionTypes.html <http://farrago.sourceforge.net/design/CollectionTypes.html>
> On Apr 16, 2019, at 5:08 PM, James Taylor <ja...@apache.org> wrote:
>
> Hello SQL experts,
> Does Calcite support the ARRAY subquery expression[1]? It looks liked based
> on SqlArrayQueryConstructor, it does [2]? Do folks know if this is standard
> SQL and supported in very many databases?
>
> The use case is to simplify queries that process arrays. Instead of doing a
> cross join, you can use the ARRAY function on a subquery. For example, you
> can do this:
>
> select d.id,
> ARRAY(SELECT STRUCT(
> date_trunc('day',s.timestamp) as occurred_at,
> s.user_id,
> s.path_id,
> s.accepted_source
> )
> FROM UNNEST(ARRAY_CONCAT(
> previous_states,
> current_state) s
> ) AS all_states
> FROM my_data d
>
> instead of this:
>
> WITH arrayed_data AS (
> SELECT d.created_at, d.id,
> ARRAY_CONCAT(d.previous_states,
> current_state) as accepted
> FROM my_data d
> )
> select all_a.id,
> ARRAY_AGG(CAST(ROW(
> date_trunc('day',a.timestamp),
> a.user_id,
> a.path_id,
> a.accept_source
> ) as ROW(occurred_at TIMESTAMP,
> id varchar,
> path_id varchar,
> accept_source varchar)))
> FROM arrayed_data as all_a
> CROSS JOIN UNNEST(all_a.accepted) AS a
> GROUP BY all_a.id
>
> Thanks,
> James
>
> [1]
> https://cloud.google.com/bigquery/docs/reference/standard-sql/array_functions
> [2]
> https://calcite.apache.org/apidocs/org/apache/calcite/sql/fun/SqlArrayQueryConstructor.html