2012-01-07 11 views
11

En Postgres, ANY y SOME son sinónimos cuando se usan en el lado derecho de una expresión de predicado. Por ejemplo, estos son los mismos:¿Hay SQL ALGUNOS y ALGUNOS sinónimos de palabras clave en todos los dialectos de SQL?

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

Esto está documentado aquí:

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

he observado ANY y SOME ser apoyada por al menos éstos SQL DBMS:

  • DB2
  • Derby
  • H2
  • HSQLDB
  • Ingres
  • MySQL
  • Oracle
  • Postgres
  • SQL Server
  • Sybase ASE
  • Sybase SQL Anywhere

¿Puedo con seguridad asumir que todos esos d ialects (y otros, también) tratan ANY y SOME como sinónimos o existe una diferencia sutil entre las dos palabras clave en alguno/algunos DBMS?

He encontrado esto en la definición SQL92:

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

Esto no dice nada acerca de la semántica de ANY y SOME. Más adelante en el documento, solo se hace referencia al <some>, no a las dos palabras clave. Sospecho que podría haber una diferencia sutil en el manejo de NULL, por ejemplo, al menos en algunos DBMS. Cualquier/algún puntero a una declaración clara de si esto puede ser asumido o no es bienvenido.

+2

+1 Yo ni siquiera sabía acerca de ALGUNO/CUALQUIERA hasta esta pregunta. ¡Aprenda algo nuevo cada día! :-) – klabranche

+0

@klabranche: ¡Sí, permite una sub consulta muy elegante! Postgres incluso acepta una sintaxis [ANY (array), SOME (array), ALL (array)] (http://www.postgresql.org/docs/9.1/static/functions-comparisons.html#AEN17416) –

+0

Definitivamente algo para poner en la herramienta de cinturón. – klabranche

Respuesta

5

pocas líneas después de lo que está citando, el estándar SQL92 especifica también la semántica de <some>, a saber: se aplican

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. 

Estas reglas para el token <some>, independientemente de si se trata del algunas o ninguna alternativa , así que sí, son sinónimos de acuerdo con el estándar

+0

Parece que sí, sí. Como dije, se hace referencia al '', y no a las palabras clave. Pero no dice que las palabras clave siempre signifiquen lo mismo * explícitamente *. Después de todo, se ha observado que muchas bases de datos se apartan del estándar de vez en cuando. P.ej. Postgres: * "Tenga en cuenta que si no hay éxitos y al menos una fila de la derecha produce nulo para el resultado del operador, el resultado de la construcción ANY será nulo, no falso. Esto está de acuerdo con las reglas normales de SQL para combinaciones Booleanas de valores nulos. "* –

+0

bueno, eso debería seguir la regla (e): no hay ninguna fila para la cual el predicado sea verdadero, y al mismo tiempo no es falso para cada fila; se desconoce para la fila con nulo. Entonces, ni (c) ni (d) se pueden aplicar y el resultado del operador any/some es desconocido – voidengine

+0

Supongo que tienes razón ... Estoy 99% tendiendo hacia tu opinión. A la espera de alguien que podría haber tenido alguna/otra experiencia :) –

Cuestiones relacionadas