Есть ли у MySQL и PostgreSQL аналог Google BigQuery STRUCT?
Довольно удобно, что вы можете создать структуру в любом месте с помощью
STRUCT(<value_1> as <field_1>, <value_2> as <field_2>, ...)
В PostgreSQL есть CREATE TYPE, но он не кажется таким легким.
Есть ли более-менее прямой аналог?
Например, в BigQuery мы можем создать таблицу следующим образом:
create or replace table my_dataset.t as (
select "John" as name, struct("US" as country, "New York" as city) as location union all
select "James" as name, struct("US" as country, "Seattle" as city) as location
);
Страна и город организованы в структуру, что часто бывает удобно. Например. мы можем перечислить все местоположения, запустив
select location from my_dataset.t;
В PostgreSQL это кажется выполнимым, если мы создадим тип. Я правильно понимаю, что иначе все не так просто?
Кажется, это не совсем то же самое. У строки нет имен столбцов, а у структуры есть. Таким образом, с помощью struct вы можете упростить последующие запросы, например: with people as (select "John" as name, struct("US" as country, "New York" as city) as location) select location.* from people;






В PostgreSQL вы можете использовать:
SELECT * FROM (VALUES(1, 2)) AS tab(a, b);
a | b
---+---
1 | 2
(1 row)
Пример в ваших комментариях немного сложнее, но ничего такого, чего бы вы не смогли сделать в PostgreSQL:
WITH location AS (
SELECT 'US' AS country,
'New York' AS city
),
people AS (
SELECT 'John' AS name,
location
FROM location
)
SELECT (location).* FROM people;
Я не мог обобщить ваш пример более чем на одну строку. В BQ я мог бы сделать:with people as ( select "John" as name, struct("US" as country, "New York" as city) as location union all select "James" as name, struct("US" as country, "Seattle" as city) as location ) select location.* from people; Есть ли аналог PostreSQL? Большое спасибо!!
Предложение VALUES может иметь более одной строки, а с оператором SELECT вы можете использовать UNION ALL, чтобы получить больше строк.
Я переформулировал вопрос. Извините, я думаю, что это не было хорошо сформулировано раньше.
PostgreSQL имеет конструктор
ROW(...), и вы можете дать результатам запроса псевдоним, так что вы можете получить почти то же самое.