我使用SQL(SQL Server,PostgreSQL)超过10年,但我仍然没有在我的生产代码中使用ANY/SOME
和ALL
个关键字。我遇到的所有情况都可以通过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/SOME
和ALL
:
所以问题是:我错过了什么吗?是否存在ANY/SOME
和ALL
超越其他解决方案的情况?
答案 0 :(得分:13)
当你不只是测试平等或不平等时,我发现ANY和ALL非常有用。考虑
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
as used my answer to this question
ANY
,ALL
及其否定可以极大地简化原本需要非平凡子查询或CTE的代码,并且在我看来它们的使用率非常低。
考虑ANY
可以与任何运营商合作。它对LIKE
和~
非常方便,但可以使用tsquery,数组成员资格测试,hstore密钥测试等。
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
或:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
如果没有ANY
或ALL
,您可能必须在VALUES
列表中将这些表示为子查询或CTE,并使用聚合生成单个结果。当然,如果你愿意,你可以这样做,但我会坚持ANY
。
这里有一个真实的警告:在较旧的Pg版本中,如果您正在撰写ANY( SELECT ... )
,那么您在EXISTS (SELECT 1 FROM ... WHERE ...)
的性能方面几乎肯定会更好。如果您使用的是优化程序将ANY (...)
转换为联接的版本,则无需担心。如有疑问,请检查EXPLAIN
输出。
答案 1 :(得分:6)
不,我从未使用ANY
,ALL
或SOME
关键字,而且我从未在其他人的代码中看到过这些关键字。我假设这些是残留语法,就像SQL中某些地方出现的各种可选关键字一样(例如,AS
)。
请记住,SQL是由委员会定义的。
答案 2 :(得分:0)
我曾尝试过任何事情,但没有遗漏任何东西,只有在我使用Not
条件时才会有不同类型的习惯。存在和将需要添加而不是任何/某些只是将运算符更改为<>
。我只使用sql server,我不确定其他软件是否可能遗漏了什么