Выбор PostgreSQL для массивов составных элементов - PullRequest
4 голосов
/ 28 июля 2011

У меня есть таблица, определенная для составного типа:

create type footype as (  
a double precision,
b double precision
);  

create table footable as (  
x integer,  
y footype []);

Как я могу использовать оператор выбора для одного поля составных элементов, содержащихся в таблице?

Заранее спасибо,
Антонио

Ответы [ 3 ]

8 голосов
/ 28 июля 2011

Просто обычный синтаксис доступа к массиву , за которым следует обычный синтаксис доступа составного типа . Итак, немного настроек для демонстрационных целей:

=> insert into footable (x, y) values(1, ARRAY[(1.0,2.0)::footype]);
=> select * from footable;
 x |     y     
---+-----------
 1 | {"(1,2)"}
(1 row)

А потом:

=> select y[1].a, y[1].b from footable where x = 1;
 a | b 
---+---
 1 | 2
(1 row)

Вы также можете получить доступ к составному типу внутри предложения WHERE:

=> select * from footable where y[1].b < 3;
 x |         y         
---+-------------------
 1 | {"(1,2)"}
(1 row)
5 голосов
/ 28 июля 2011

Прежде всего, есть одна ошибка, слово «as» неверно в запросе создания таблицы. Вам лучше написать это:

create table footable (
    x integer,  
    y footype []
);

Вставить данные в таблицу:

insert into footable(x, y) values(10, ARRAY[ ROW(1.0,2.0), ROW(3,4)]::footype[] );

# select * from footable;
 x  |         y         
----+-------------------
 10 | {"(1,2)","(3,4)"}
(1 row)

Получить данные по полям:

# select x, y[1], y[1].a, y[1].b from footable;

 x  |   y   | a | b 
----+-------+---+---
 10 | (1,2) | 1 | 2
(1 row)
0 голосов
/ 29 июля 2011

Я исправил решение, которое не сработало, поскольку в нем была ошибка в функции generate_subscripts (). Я изменил столбец в этой функции, потому что он должен быть столбцом типа массива (y), а не атомарным (x):

=> select * from (select x, y, generate_subscripts(y,1) as s from footable) as coord where y[s].a = 2.5;
...