2012-01-07 3 views
11

Postgres에서 ANYSOME은 술어 표현식의 오른쪽에서 사용할 때 동의어입니다. 예를 들어, 이들은 동일합니다 : 모든 SQL dialect에서 SQL ANY 및 SOME 키워드는 동의어입니까?

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

는 여기에 설명되어 있습니다 :

  • 포스트 그레스
  • SQL 서버
  • 사이베이스 ASE
  • 사이베이스 SQL 내가 안전하게 가정 할 수 그 모든 d 개 ialects (및 다른 사람도)는 ANYSOME을 동의어로 취급합니까? 아니면 어떤/일부 DBMS의 두 키워드 사이에 미묘한 차이가 있습니까?

    나는 SQL92의 정의에서 이것을 발견 :이 ANYSOME의 의미에 대해 아무 말도하지 않습니다

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

    . 이 문서의 뒷부분에서 두 키워드가 아닌 <some> 만 참조됩니다. 예를 들어, 적어도 DBMS에서 적어도 핸들이 미묘한 차이가있을 수 있습니다. 이것이 가능하든 아니든 명확한 진술에 대한 어떤/어떤 포인터.

  • +2

    +1 나는이 SO 질문까지 어느 정도는 모릅니다. 새로운 것을 매일 배우십시오! :-) – klabranche

    +0

    @klabranche : 그래, 매우 우아한 하위 쿼리를 허용합니다! Postgres는 [ANY (배열), SOME (배열), ALL (배열)] (http://www.postgresql.org/docs/9.1/static/functions-comparisons.html#AEN17416) 구문 –

    +0

    을 허용합니다. 툴 벨트에 넣는다. – klabranche

    답변

    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 구문의 결과는 false가 아니라 null이됩니다. 이것은 SQL의 부울 조합에 대한 일반적인 규칙을 따릅니다. null 값의. "* –

    +0

    글쎄, 규칙 (e)에 따라야한다. : 술어가 참이었던 행이없고, 동시에 모든 행에 대해 거짓이 아닌 행이 없다 - null이있는 행은 알 수 없다. 따라서 (c)도 (d)도 적용 할 수 없으며 any/some 연산자의 결과는 알 수 없음 – voidengine

    +0

    당신 말이 맞아요 ... 나는 당신의 의견에 대해 99 % 기울이고 있습니다. 그냥/어떤 다른 경험을했을 수도있는 사람을 기다리고 :) –