una sql3 sirve que para novedades lenguaje historia estándar consulta sql oracle plsql

sql3 - ¿Es esta implementación SQL-92 conforme?



sql 92 manual (5)

Tony Andrews en otra pregunta dio un ejemplo de:

IF p_c_courtesies_cd || p_c_language_cd || v_c_name || v_c_firstname || v_c_function || p_c_phone || p_c_mobile p_c_fax || v_c_email is not null THEN -- Do something END IF;

como una alternativa inteligente (si no un poco oscura) a la función Oracle COALESCE. Efectivamente, funciona, si algún argumento no es nulo, la prueba IF es verdadera. Mi pregunta: ¿La implementación de Oracle de la operación de concatenación anterior de SQL-92 es conforme? ¿No debería una expresión que implica un NULL evaluar a NULL? Si no lo crees, ¿por qué debería la expresión 1 + NULL evaluar a NULL?


@Nezroy: gracias por el enlace. Sin embargo, al leer el estándar, creo que indica que la implementación de Oracle es, de hecho, incorrecta. Sección 6.13, Reglas generales, punto 2a:

2) If <concatenation> is specified, then let S1 and S2 be the re- sult of the <character value expression> and <character factor>, respectively. Case: a) If either S1 or S2 is the null value, then the result of the <concatenation> is the null value.


Bueno, COALESCE está definido explícitamente por el estándar SQL-92 para devolver el primer valor no NULL en la lista; por definición, la implementación de Oracle se está comportando correctamente.

EDITAR: la especificación SQL-92 ; busque COALESCE para ver su definición.

Dicho esto, no hay nada específico acerca de NULL que indique que cualquier operación que implique NULL debe ser NULL. La restricción más exacta es que NULL no es falso ni 0 ni es igual a otro NULL (por ejemplo, NULL == NULL es falso, porque un NULL no es igual a otro NULL). Sin embargo, eso no significa que no pueda haber formas lógicamente consistentes de trabajar con NULL que no siempre devuelvan NULL.

EDITAR: Entonces NULL + 1 es NULL de la misma manera que NaN + 1 sigue siendo NaN; es efectivamente una operación indefinida.


En función de la parte de la especificación SQL-92 resaltada por DCookie y el comportamiento de otros DB, diría que Oracle no se está comportando de manera estándar con su operador de concatenación.

Oracle (de la respuesta de tuinstoel):

SQL> select ''something''||null from dual; ''SOMETHIN --------- something

MSSQL:

SELECT ''something''+NULL; NULL

PostgreSQL:

postgres=# /pset null ''(null)'' Null display is "(null)". postgres=# select ''something''||null as output; output -------- (null) (1 row)

MySQL:

mysql> select concat(''something'',NULL) as output; +--------+ | output | +--------+ | NULL | +--------+ 1 row in set (0.00 sec)


SQL> select ''something''||null from dual; ''SOMETHIN --------- something

la concatenación de cadenas con nulo no da como resultado un nulo. Creo que esto es un comportamiento normal, estoy acostumbrado. No sé qué más decir.


No, el tratamiento de Oracle de nulos es idiosincrásico, diferente de los demás, e inconsistente con los estándares de ANSI. ¡Sin embargo, en defensa de Oracle, probablemente se decidió y se comprometió con este tratamiento mucho antes de que existiera un estándar ANSI con el que ser consecuente!

Todo comienza por el hecho de que Oracle almacena cadenas con un recuento de caracteres seguido de los datos de cadena. Un NULL está representado por un recuento de caracteres de cero sin datos de cadena siguientes, que es exactamente lo mismo que una cadena vacía (''''). Oracle simplemente no tiene una forma de distinguirlos.

Esto conduce a un comportamiento peculiar, como este caso de concatenación. Oracle también tiene una función LENGTH para devolver la longitud de una cadena, pero esto se ha definido de manera opuesta, por lo que LENGTH ('''') devuelve NULL, no cero. Asi que:

LENGTH(''abc'') + LENGTH('''') IS NULL LENGTH(''abc'' || '''') = 3

que me parece que viola los principios matemáticos básicos.

Por supuesto, los desarrolladores de Oracle se acostumbran tanto a esto que muchos de nosotros ni siquiera podemos ver nada malo o extraño al respecto, algunos de hecho argumentan que el resto del mundo está equivocado y que una cadena vacía y un NULL son los mismos ¡cosa!