41

我都试过了

1) smthng = any(从 exmplTable 中选择 id)

2) smthng in (select id from exmplTable)

我的数据得到了相同的结果。

这两种表达方式有什么区别吗?

4

3 回答 3

36

不,在这些变体中是相同的:

您可以看到 - 执行计划也相同:

postgres=#解释 select * from foo1 where id in (select id from foo2);
┌────────────────────────────────────────────────── ──────────────────┐
│ 查询计划 │
╞═════════════════════════════════════════════════ ═════════════════╡
│ Hash Semi Join (cost=3.25..21.99 rows=100 width=4) │
│ 哈希条件:(foo1.id = foo2.id) │
│ -> Seq Scan on foo1 (cost=0.00..15.00 rows=1000 width=4) │
│ -> 哈希(成本=2.00..2.00 行=100 宽度=4)│
│ -> Seq Scan on foo2 (cost=0.00..2.00 rows=100 width=4) │
└────────────────────────────────────────────────── ──────────────────┘
(5 行)

postgres=#解释 select * from foo1 where id = any (select id from foo2);
┌────────────────────────────────────────────────── ──────────────────┐
│ 查询计划 │
╞═════════════════════════════════════════════════ ═════════════════╡
│ Hash Semi Join (cost=3.25..21.99 rows=100 width=4) │
│ 哈希条件:(foo1.id = foo2.id) │
│ -> Seq Scan on foo1 (cost=0.00..15.00 rows=1000 width=4) │
│ -> 哈希(成本=2.00..2.00 行=100 宽度=4)│
│ -> Seq Scan on foo2 (cost=0.00..2.00 rows=100 width=4) │
└────────────────────────────────────────────────── ──────────────────┘
(5 行)
于 2015-05-15T15:59:11.993 回答
20

这可能是一个边缘情况,但是:

select * from myTable where id IN ()

将产生:错误:“)”处或附近的语法错误

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

将返回一个空的结果集

于 2018-04-25T17:59:06.063 回答
2

注意:经过验证和工作

创建表:用户

CREATE TABLE user (
  id serial PRIMARY KEY,
  username VARCHAR(50) UNIQUE NOT NULL,
  skills VARCHAR[50]
);

插入数据

insert into user (username, skills) values ('user1', '{java, python}');
insert into user (username, skills) values ('user2', '{python}');
insert into user (username) values ('user3');

在上表用户中,当我们在技能列中搜索“python”时,它将返回 2 行。因为它与前 2 行中的 python 匹配。

SELECT * FROM user where  'python' = ANY (skills);

输出

 1 | user1 | {java, python}
 2 | user2 | {python} 
于 2021-02-12T09:52:25.110 回答