Rom*_*kar 11 mysql sql sql-server postgresql ansi-sql
我在10年使用SQL(SQL服务器,PostgreSQL的),并且仍然我从来没有使用过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);
Run Code Online (Sandbox Code Playgroud)
要么
-- < 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);
Run Code Online (Sandbox Code Playgroud)
使用ANY/SOME和ALL:
所以问题是:我错过了什么吗?是否存在某种情况,ANY/SOME并ALL在其他解决方案上闪耀?
Cra*_*ger 13
当你不只是测试平等或不平等时,我发现ANY和ALL非常有用.考虑
'blah' LIKE ANY (ARRAY['%lah', '%fah', '%dah']);
Run Code Online (Sandbox Code Playgroud)
ANY,ALL他们否定可以极大地简化代码,会另有要求的不平凡的子查询或热膨胀系数,和他们显著是在我看来下使用.
考虑到这ANY将适用于任何运营商.这是非常方便的使用LIKE和~,但将与tsquery,阵列会员测试工作,hstore关键测试,等等.
'a => 1, e => 2'::hstore ? ANY (ARRAY['a', 'b', 'c', 'd'])
Run Code Online (Sandbox Code Playgroud)
要么:
'a => 1, b => 2'::hstore ? ALL (ARRAY['a', 'b'])
Run Code Online (Sandbox Code Playgroud)
没有ANY或ALL你可能不得不将这些作为子查询或CTE表示在VALUES列表上,并使用聚合来生成单个结果.当然,如果你愿意,你可以这样做,但我会坚持ANY.
这里有一个真正的警告:在较旧的Pg版本中,如果你正在写作ANY( SELECT ... ),你几乎肯定会在性能方面更好EXISTS (SELECT 1 FROM ... WHERE ...).如果您使用的是优化程序将变为ANY (...)连接的版本,则无需担心.如有疑问,请检查EXPLAIN输出.
不,我从未使用过ANY,ALL或SOME关键字,我从未见过在其他人的代码中使用它们.我假设这些是残留语法,就像SQL中某些地方出现的各种可选关键字一样(例如AS).
请记住,SQL是由委员会定义的.
| 归档时间: |
|
| 查看次数: |
6452 次 |
| 最近记录: |