Аналог BigQuery STRUCT в PostgreSQL и MySQL

Есть ли у 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 это кажется выполнимым, если мы создадим тип. Я правильно понимаю, что иначе все не так просто?

PostgreSQL имеет конструктор ROW(...), и вы можете дать результатам запроса псевдоним, так что вы можете получить почти то же самое.

Laurenz Albe 30.04.2019 07:46

Кажется, это не совсем то же самое. У строки нет имен столбцов, а у структуры есть. Таким образом, с помощью struct вы можете упростить последующие запросы, например: with people as (select "John" as name, struct("US" as country, "New York" as city) as location) select location.* from people;

Evgeny 30.04.2019 09:12
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
2
478
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В 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? Большое спасибо!!

Evgeny 12.06.2019 07:49

Предложение VALUES может иметь более одной строки, а с оператором SELECT вы можете использовать UNION ALL, чтобы получить больше строк.

Laurenz Albe 12.06.2019 07:51

Я переформулировал вопрос. Извините, я думаю, что это не было хорошо сформулировано раньше.

Evgeny 12.06.2019 08:16

Другие вопросы по теме