postgreSQL - 在与任何

Posted

技术标签:

【中文标题】postgreSQL - 在与任何【英文标题】:postgreSQL - in vs any 【发布时间】:2015-07-27 14:58:50 【问题描述】:

我都试过了

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

2) smthng in(从 exmplTable 中选择 id)

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

这两个表达式有什么不同吗?

【问题讨论】:

来自docs:SOMEANY 的同义词。 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 完全开源,可从任何节点查询

postgres安装数据库集群初始化失败(Postgresql Version 9.4.4)

postgresql无法正常启动的原因追查

执行 Postgres 分析

PostgreSQL 每周新闻— 2022年3月23日