postgreSQL - 在与任何
Posted
技术标签:
【中文标题】postgreSQL - 在与任何【英文标题】:postgreSQL - in vs any 【发布时间】:2015-07-27 14:58:50 【问题描述】:我都试过了
1) smthng = any(从 exmplTable 中选择 id)
2) smthng in(从 exmplTable 中选择 id)
我的数据得到了相同的结果。
这两个表达式有什么不同吗?
【问题讨论】:
来自docs:SOME
是ANY
的同义词。 IN
等价于= ANY
。
看看,这里有解释:postgresql.org/docs/current/static/functions-comparisons.html
这能回答你的问题吗? Difference between in and any operators in sql
【参考方案1】:
注意:已通过验证并正常工作
创建表:用户
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
【讨论】:
【参考方案2】:这可能是一种极端情况,但是:
select * from myTable where id IN ()
将产生:错误:“)”处或附近的语法错误
但是
select * from myTable where id = ANY('');
将返回一个空的结果集
【讨论】:
在查询动态数据集(Pg/PLSQL、应用程序编程等)时,这是一件好事。【参考方案3】:不,在这些变体中是相同的:
你可以看到 - 执行计划也是一样的:
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 行)【讨论】:
请注意,虽然这对于采用 set 的表单是正确的,但每个IN ()
和 = ANY()
都有第二个表单,它们并不完全等效。考虑:***.com/a/34627688/939860 和 dba.stackexchange.com/q/125413/3684
@ErwinBrandstetter: =ANY(ARRAY) 是不同的生物.. 虽然语法相同以上是关于postgreSQL - 在与任何的主要内容,如果未能解决你的问题,请参考以下文章
国际新闻|Citus 11 for Postgres 完全开源,可从任何节点查询
国际新闻|Citus 11 for Postgres 完全开源,可从任何节点查询