Postgres - частичные совпадения для составных типов в массиве - PullRequest
0 голосов
/ 20 января 2020

Этот вопрос следует из предыдущего , который я задал здесь. Еще раз, рассмотрим следующий пример

CREATE TYPE dow_id AS
(
 tslot smallint,
 day smallint
);

CREATE SEQUENCE test_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 2147483647 START 1 CACHE 1;

CREATE TABLE test_composite_array 
(
 id integer DEFAULT nextval('test_id_seq') NOT NULL,
 dx  dow_id[]
);

, где я сделал следующее

  • определил составной тип
  • создал таблицу, которая использует ранее определенный составной введите столбец массива

Теперь я могу go и заполнить эту таблицу. Например,

INSERT INTO test_composite_array (dx) VALUES(ARRAY[CAST(ROW(1,1) AS dow_id),CAST(ROW(1,2) AS dow_id)]);
INSERT INTO test_composite_array (dx) VALUES(ARRAY[CAST(ROW(2,1) AS dow_id),CAST(ROW(2,2) AS dow_id)]); 
INSERT INTO test_composite_array (dx) VALUES(ARRAY[CAST(ROW(3,1) AS dow_id),CAST(ROW(3,2) AS dow_id)]);

После чего я могу выполнить следующие запросы

SELECT * FROM test_composite_array;

, что приводит к

id dw

9 {"(1,1)", "(1,2)"}

10 {"(2,1)" , "(2,2)"}

11 {"(3,1)", "(3,2)"}

12 {"(3,1)", " (3, -2) "}

ИЛИ

 select id from test_composite_array where ROW(CAST(3 AS SMALLINT),CAST(-2 AS SMALLINT)) = ANY(dx);

, что дает

id

12

Но предположим, что я хочу получить все строки , где значение day равно 2 - т.е. мне действительно все равно, что такое значение tslot. В моем примере возвращаемым результатом должны быть строки с id's 10 , 11 и 12 . Мне не ясно, как / могу ли я это сделать.

...