postgreSQL - in vs any

时间:2015-05-15 15:46:43

标签: postgresql operation any sql-in

我试过了两次

1) smthng =任何(从exmplTable中选择ID)

2) smthng (从exmplTable中选择ID)

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

这两个 expresions 有什么区别吗?

3 个答案:

答案 0 :(得分:21)

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

你可以看到 - 执行计划也一样:

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)

答案 1 :(得分:5)

这可能是一个边缘案例,但是:

select * from myTable where id IN ()

将产生:错误:语法错误在或附近")"

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

将返回空结果集

答案 2 :(得分:0)

注意:已验证且有效

创建表:用户

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');

在上表user中,当我们在技能列中搜索'python'时,它会返回2行。因为它匹配前 2 行中的 python。

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

输出

 1 | user1 | {java, python}
 2 | user2 | {python}