11

我使用 SQL(SQL Server、PostgreSQL)已有 10 多年了,但我仍然从未在我的生产代码中使用过关键字ANY/SOMEALL我遇到的所有情况都可以使用IN, MAX, MIN, EXISTS, 并且我认为它更具可读性。

例如:

-- = ANY
select * from Users as U where U.ID = ANY(select P.User_ID from Payments as P);

-- IN
select * from Users as U where U.ID IN (select P.User_ID from Payments as P);

或者

-- < ANY
select * from Users as U where U.Salary < ANY(select P.Amount from Payments as P);

-- EXISTS
select * from Users as U where EXISTS (select * from Payments as P where P.Amount > U.Salary);

使用ANY/SOMEALL

所以问题是:我错过了什么吗?是否存在某些情况ANY/SOMEALL超越其他解决方案?

4

3 回答 3

13

我发现 ANY 和 ALL 在您不只是测试平等或不平等时非常有用。考虑

'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);

正如我对这个问题的回答一样

ANYALL它们的否定可以极大地简化代码,否则这些代码需要非平凡的子查询或 CTE,在我看来,它们的使用明显不足。

考虑到这ANY将适用于任何运营商。LIKE与and一起使用非常方便~,但可以与 tsquery、数组成员资格测试、hstore 密钥测试等一起使用。

'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])

或者:

'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])

如果没有ANY,或者ALL您可能必须将它们表示为子查询或 CTE,而不是VALUES带有聚合的列表以产生单个结果。当然,如果你愿意,你可以这样做,但我会坚持ANY

ANY( SELECT ... )这里有一个真正的警告:在旧的Pg版本上,如果您正在编写EXISTS (SELECT 1 FROM ... WHERE ...). 如果您使用的是优化器将变成ANY (...)连接的版本,那么您无需担心。如果有疑问,请检查EXPLAIN输出。

于 2013-07-11T09:03:35.737 回答
6

不,我也从未使用过ANYALLSOME关键字,也从未见过它们在其他人的代码中使用过。我假设这些是残留语法,就像 SQL 中某些地方出现的各种可选关键字(例如,AS)。

请记住,SQL 是由委员会定义的。

于 2013-07-11T08:22:47.997 回答
0

我尝试过任何东西,但没有遗漏任何东西,只有当我使用Not条件时才会出现不同类型的习惯。exists 和 in 将需要添加 not 而 any/some 只需将运算符更改为<>. 我只使用 sql server,我不确定其他软件可能会丢失一些东西

于 2013-07-11T08:27:11.880 回答