2012-01-07 43 views
11

在Postgres中,ANYSOME在謂詞表達式的右側使用時是同義詞。例如,這些是相同的:所有SQL方言中的SQL ANY和SOME關鍵字是同義詞嗎?

column = ANY (SELECT ...) 
column = SOME (SELECT ...) 

這是記錄在這裏:

http://www.postgresql.org/docs/9.1/static/functions-subquery.html#FUNCTIONS-SUBQUERY-ANY-SOME

我觀察ANYSOME由至少這些SQL數據庫管理系統的支持:

  • DB2
  • Derby
  • H2
  • HSQLDB
  • 安格爾
  • MySQL的
  • 甲骨文
  • Postgres的
  • SQL服務器
  • 的Sybase ASE
  • Sybase SQL Anywhere的

我可以有把握地認爲所有這些d ialect(和其他人)將ANYSOME視爲同義詞,還是在任何/某些DBMS中的兩個關鍵字之間存在細微差別?

我在SQL92定義發現這一點:

<quantifier> ::= <all> | <some> 
<all> ::= ALL 
<some> ::= SOME | ANY 

這並不是說有關的ANYSOME語義事情。稍後在文檔中,僅引用<some>,而不是兩個關鍵字。我懷疑NULL在處理方面可能存在細微差別,例如至少在某些DBMS中。任何/某些指向明確聲明的指針是否可以假定或不可接受。你什麼報價後

+2

+1我甚至不知道有些什麼,直到這個問題。每天學些新東西! :-) – klabranche 2012-01-07 17:41:37

+0

@klabranche:是的,它允許非常優雅的subquerying! Postgres甚至接受[ANY(array),SOME(array),ALL(array)](http://www.postgresql.org/docs/9.1/static/functions-comparisons.html#AEN17416)語法 – 2012-01-07 17:45:37

+0

絕對是放入工具帶。 – klabranche 2012-01-07 17:58:24

回答

5

幾行字,SQL92標準還規定了語義<some>,即:

c) If the implied <comparison predicate> is true for at least 
one row RT in T, then "R <comp op> <some> T" is true. 

d) If T is empty or if the implied <comparison predicate> is 
false for every row RT in T, then "R <comp op> <some> T" is 
false. 

e) If "R <comp op> <quantifier> T" is neither true nor false, 
then it is unknown. 

這些規則適用於<some>令牌,獨立於它是在一些或任何替代,所以是的,他們是根據標準的同義詞

+0

它看起來像,是的。正如我所說,''被引用,而不是關鍵字。但並不是說關鍵字總是表示相同的*顯式*。畢竟,觀察到許多數據庫偶爾會偏離標準。例如。 Postgres:*「請注意,如果沒有成功,並且至少有一個右側行對於運算符的結果爲null,那麼ANY結構的結果將爲null,而不是false。這符合SQL對布爾組合的常規規則的空值。「* – 2012-01-07 17:51:48

+0

好吧,那應該遵循規則(e):沒有行的謂詞是真的,同時它對每一行都不是錯誤的 - 對於具有null的行是未知的。所以(c)和(d)都不能應用,任何/某些運算符的結果是未知的 – voidengine 2012-01-07 18:00:51

+0

我想你是對的......我99%傾向於你的意見。只是在等待可能有任何/其他經驗的人:) – 2012-01-07 18:05:57