Подтвердить что ты не робот

PostgreSQL - в сравнении с любым

Я пробовал оба

1) smthng = any (выберите id из exmplTable)

2) smthng в (выберите id из exmplTable)

и я получаю те же результаты для своих данных.

Есть ли разница для двух выражений?

4b9b3361

Ответ 1

Нет, в этих вариантах одинаковы:

Вы можете видеть - планы выполнения тоже самые:

postgres=# explain select * from foo1 where id in (select id from foo2);
┌──────────────────────────────────────────────────────────────────┐
│                            QUERY PLAN                            │
╞══════════════════════════════════════════════════════════════════╡
│ Hash Semi Join  (cost=3.25..21.99 rows=100 width=4)              │
│   Hash Cond: (foo1.id = foo2.id)                                 │
│   ->  Seq Scan on foo1  (cost=0.00..15.00 rows=1000 width=4)     │
│   ->  Hash  (cost=2.00..2.00 rows=100 width=4)                   │
│         ->  Seq Scan on foo2  (cost=0.00..2.00 rows=100 width=4) │
└──────────────────────────────────────────────────────────────────┘
(5 rows)

postgres=# explain select * from foo1 where id = any (select id from foo2);
┌──────────────────────────────────────────────────────────────────┐
│                            QUERY PLAN                            │
╞══════════════════════════════════════════════════════════════════╡
│ Hash Semi Join  (cost=3.25..21.99 rows=100 width=4)              │
│   Hash Cond: (foo1.id = foo2.id)                                 │
│   ->  Seq Scan on foo1  (cost=0.00..15.00 rows=1000 width=4)     │
│   ->  Hash  (cost=2.00..2.00 rows=100 width=4)                   │
│         ->  Seq Scan on foo2  (cost=0.00..2.00 rows=100 width=4) │
└──────────────────────────────────────────────────────────────────┘
(5 rows)

Ответ 2

Это может быть краевой случай, но:

select * from myTable where id IN ()

будет производить: ERROR: синтаксическая ошибка в точке или рядом ")"

но

select * from myTable where id = ANY('{}');

Вернет пустой набор результатов