Size: a a a

pgsql – PostgreSQL

2020 May 25

SC

Sergey Cherkesov in pgsql – PostgreSQL
Yaroslav Schekin
А где здесь conflict-то? У Вас же его никогда не происходит, нет?
Я пропустил создание уникального констреинта для столбца name, не могу палить схему реальной БД, набирал сферический пример в вакууме
источник

A

Artyom A in pgsql – PostgreSQL
Роман Жарков
select *
from hehehe
where ( col1, col2, col3 ) in ( select fld1, fld2, fld3 from gygygy );

Не оно?
Subquey has too many columns. С одной колонкой ок.
источник

Ð

Ð in pgsql – PostgreSQL
Artyom A
Ребята, можно ли написать оператор IN (select col1, col2, col3 ). Нужно как то перегнать 3 колонки в массив что бы его сьел IN?
можно, any
источник

SC

Sergey Cherkesov in pgsql – PostgreSQL
Yaroslav Schekin
А где здесь conflict-то? У Вас же его никогда не происходит, нет?
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Artyom A
Subquey has too many columns. С одной колонкой ок.
test=# create table gygygy ( fld1 int, fld2 int, fld3 int);
CREATE TABLE
test=# create table hehehe ( col0 int, col1 int, col2 int, col3  int );
CREATE TABLE
test=# select *
test-# from hehehe
test-# where ( col1, col2, col3 ) in ( select fld1, fld2, fld3 from gygygy );
col0 | col1 | col2 | col3
------+------+------+------
(0 rows)
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Sergey Cherkesov
Я пропустил создание уникального констреинта для столбца name, не могу палить схему реальной БД, набирал сферический пример в вакууме
А, понятно.

Тогда вот это:

> 1) при вставке значения insert returning вернет строку, select where вернет строку

Неправильно (попробуйте / проверьте сами). Только INSERT вернёт строку.
Как-то так проще проверять, наверное:
WITH inserted_row AS (
  INSERT INTO participant(name)
  VALUES ('Foo Bar')
      ON CONFLICT DO NOTHING
         RETURNING *
)
SELECT *, 't'::boolean AS inserted
 FROM inserted_row
UNION ALL
SELECT *, 'f'::boolean AS inserted
 FROM participant
WHERE name = 'Foo Bar';
источник

SC

Sergey Cherkesov in pgsql – PostgreSQL
Yaroslav Schekin
А, понятно.

Тогда вот это:

> 1) при вставке значения insert returning вернет строку, select where вернет строку

Неправильно (попробуйте / проверьте сами). Только INSERT вернёт строку.
Как-то так проще проверять, наверное:
WITH inserted_row AS (
  INSERT INTO participant(name)
  VALUES ('Foo Bar')
      ON CONFLICT DO NOTHING
         RETURNING *
)
SELECT *, 't'::boolean AS inserted
 FROM inserted_row
UNION ALL
SELECT *, 'f'::boolean AS inserted
 FROM participant
WHERE name = 'Foo Bar';
Я понял по поводу решения, но мне больше интересна причина.
INSERT ставит добавление в очередь, а SELECT который после UNION ALL смотрит в MVCC представление где еще нет такой записи??
Хочу понять почему такое поведение
источник

Ð

Ð in pgsql – PostgreSQL
Роман Жарков
test=# create table gygygy ( fld1 int, fld2 int, fld3 int);
CREATE TABLE
test=# create table hehehe ( col0 int, col1 int, col2 int, col3  int );
CREATE TABLE
test=# select *
test-# from hehehe
test-# where ( col1, col2, col3 ) in ( select fld1, fld2, fld3 from gygygy );
col0 | col1 | col2 | col3
------+------+------+------
(0 rows)
select * from t where (f1, f2) = any (values(1,1),(2,2))
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Sergey Cherkesov
Я понял по поводу решения, но мне больше интересна причина.
INSERT ставит добавление в очередь, а SELECT который после UNION ALL смотрит в MVCC представление где еще нет такой записи??
Хочу понять почему такое поведение
Весь запрос (включая его CTE) выполняется в одном snapshot.
Это описано тут: https://www.postgresql.org/docs/current/queries-with.html#QUERIES-WITH-MODIFYING
Там есть нюансы, конечно (при использовании volatile функций, которые могут "брать" свои snapshots; или SELECT ... FOR UPDATE в read committed, кажется)... но общий принцип такой.
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Ð
select * from t where (f1, f2) = any (values(1,1),(2,2))
Не знаю что хочется автору вопроса, но лично я всегда старательно и вполне успешно избегал работы с массивами :)
источник

Ð

Ð in pgsql – PostgreSQL
Роман Жарков
Не знаю что хочется автору вопроса, но лично я всегда старательно и вполне успешно избегал работы с массивами :)
а где тут массивы?
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Ð
а где тут массивы?
Не знаю, но очень похоже.
источник

Ð

Ð in pgsql – PostgreSQL
Роман Жарков
Не знаю, но очень похоже.
ну знаешь, вся база похожа на гигантские массивы :)
источник

Ð

Ð in pgsql – PostgreSQL
values это всего лишь
имитация подзапроса для твоего in
источник

РЖ

Роман Жарков... in pgsql – PostgreSQL
Ð
ну знаешь, вся база похожа на гигантские массивы :)
Чур меня!
expression operator ANY (array expression)
источник

A

Artyom A in pgsql – PostgreSQL
Можно както развирнуть 3 колонки и 100 рекордов в 300 рекордов?
источник

A

Artyom A in pgsql – PostgreSQL
Разные варианты пробую
источник

Ð

Ð in pgsql – PostgreSQL
Роман Жарков
Чур меня!
expression operator ANY (array expression)
any умеет работать с массивами и подзапросами
источник

Ð

Ð in pgsql – PostgreSQL
и работает быстро, я проверял
источник

Ð

Ð in pgsql – PostgreSQL
и это единственный нормальный способ многоколоночного in который я находил
источник