SELECT ...
FROM table1 JOIN table2 ...
JOIN (
VALUES (123, ARRAY[123, 789]),
(345, ARRAY[345])
) t (id, aliases) ON (table1.userid = ANY(t.aliases))
...
SELECT t.id, string_agg(tt.data, ',')
FROM
(
VALUES (123, 'a'),
(123, 'aa'),
(789, 'b'),
(345, 'c'),
(345, 'd')
) tt (userid, data)
JOIN
(
VALUES (123, ARRAY[123, 789]),
(345, ARRAY[345])
) t (id, aliases) ON (tt.userid = ANY(t.aliases))
GROUP by t.id
select array_agg(v)
from (select jsonb_array_elements(col)->'a' v
from (values ('[{"a": 1, "b": 2}, {"a": 10, "b": 20}]'::jsonb)) as t(col)
) t1
SELECT SUM (CASE WHEN status = 1 THEN amount END) as sum1, ... FROM ... GROUP BY ..
SET search_path TO test, public;
select distinct pbx_call_id,
first_value(clid) over (partition by pbx_call_id order by callstart) clid,
... -- остальные поля
from calls;
select pbx_call_id,
jsonb_agg(json_build_object('disposition', disposition, 'sip', sip)) as sips
from calls
group by pbx_call_id
filterParams.Append("Relationship", $"\"Relationship\" @> @Relationship::jsonb", ....);
psql:parrot_yii.sql:22: ERROR: relation "public.account_history" does not exist
-- ключ нужен, чтобы точно идентифицировать строку таблицы
create table t(id int primary key);
-- партиции, без триггеров на INSERT
create table t1(primary key (id), check(id > 0 and id <= 10)) inherits(t);
create table t2(primary key (id), check(id > 10 and id <= 20)) inherits(t);
insert into t1 values (1), (4);
insert into t2 values (15);
test=# select * from t;
id
----
1
4
15
test=# select * from t1;
id
----
1
4
test=# select * from t2;
id
----
15
create or replace function t_tg_proc() returns trigger as $$
begin
raise notice 't_tg_proc called';
if TG_TABLE_NAME = 't1' and NEW.id > 10 then
delete from t1 where id = OLD.id; -- без primary key можно удалить лишнего
insert into t2 values (NEW.*);
return null; -- проигнорировать UPDATE
end if;
if TG_TABLE_NAME = 't2' and NEW.id <= 10 then
delete from t2 where id = OLD.id;
insert into t1 values (NEW.*);
return null; -- проигнорировать UPDATE
end if;
return new; -- нормальный UPDATE
end $$ language plpgsql;
create trigger t1_tg before update on t1 for each row execute procedure t_tg_proc();
create trigger t2_tg before update on t2 for each row execute procedure t_tg_proc();
-- обычный UPDATE
update t set id = 5 where id = 4;
ЗАМЕЧАНИЕ: t_tg_proc called
UPDATE 1
select * from t;
id
----
1
5
15
-- необычный UPDATE
update t set id = 11 where id = 1;
ЗАМЕЧАНИЕ: t_tg_proc called
UPDATE 0
select * from t;
id
----
5
15
11
test=# select * from t1;
id
----
5
test=# select * from t2;
id
----
15
11