NULL o VACÍO, he ahí el dilema
Bien, hace demasiado tiempo que este proyecto estaba en el baúl de los recuerdos, así que he decidido desempolvarlo e incluso tratar de darle un aire distinto a cuando lo inicié.
Espero principalmente que estas publicaciones brinden un poco más de luz o al menos otra perspectiva a otros y que logre aportar un poco a esa misma comunidad de la que tanto he recibido.
No está de más algo de información acerca de este valor que vaya que se comporta distinto según el lenguaje que se esté utilizando.
Recuerdo una pregunta que se soltó en medio de un pequeño grupo, algo como "¿qué diferencia hay entre un NULL y un String vacío?". Las respuestas no se hicieron esperar, pero no al unísono sino cada uno desde la perspectiva que primero le llegó a la mente. Referencias al espacio en memoria, al comportamiento en la ejecución de un programa o al SQL ANSI así como otras posiciones no se hicieron esperar. De la misma manera y, aún cuando todos hablen dentro del mismo contexto, a veces surgen dudas de si será esto o aquello, o si se comportará de una u otra manera.
Así que bueno, antes de continuar es importante precisar que el contexto aquí es desde la perspectiva y comportamiento de los NULL en las bases de datos Oracle (procuraré actualizarlo posteriormente con algunos otros motores).
Por supuesto, este post está inspirado en una entrada escrita por Lex de Haan y Jonathan Gennick (enlace) y sobre parte del libro Oracle PL/SQL Programming (6th edition) de Steven Feuerstein (@sfonplsql), excelente por cierto.
NULL
Este también es un valor, uno que indica completa ausencia de valor. 👀 Quizá puede sonar algo contradictorio pero es tal cual. Es decir, sería impreciso atribuir interpretaciones como "inexistente", "desconocido", etc., sin otras verificaciones según el contexto.
De la misma manera, es importante ser precavido con su uso al momento de escribir consultas o código PL/SQL. Para la muestra, algunos botones.
¿NULL o String vacío?
A diferencia de SQL Server, donde la expresión '' (doble apóstrofe) se conoce como un String vacío y difiere de la expresión NULL, en Oracle, las dos tienden a ser lo mismo, a tratarse como un NULL.
Existen, sin embargo, un par de excepciones y es que, dependiendo del tipo de dato en PL/SQL, la respuesta de una comparación puede variar.
Aunque el mismo valor se asigna a las dos variables, una Varchar2 y una Char, el resultado muestra sólo la primera como NULL. También, al ejecutar una consulta para obtener el valor de '', el resultado es un NULL.
Esto puede tener especial importancia no sólo durante el desarrollo de un proyecto sobre la DB, sino en proyectos de Datawarehouse o Data Mart donde para la fuente un valor puede diferir del destino y ello puede inducir a errores.
Bien, esto apenas fue un inicio, vendrán otros post con algunas pruebas en otros contextos como en el uso de funciones, operaciones aritméticas, etc.
Además habrá algunas otras temáticas así que espero que esto sea nutritivo para todos.
Gracias!!
Espero principalmente que estas publicaciones brinden un poco más de luz o al menos otra perspectiva a otros y que logre aportar un poco a esa misma comunidad de la que tanto he recibido.
No está de más algo de información acerca de este valor que vaya que se comporta distinto según el lenguaje que se esté utilizando.
Recuerdo una pregunta que se soltó en medio de un pequeño grupo, algo como "¿qué diferencia hay entre un NULL y un String vacío?". Las respuestas no se hicieron esperar, pero no al unísono sino cada uno desde la perspectiva que primero le llegó a la mente. Referencias al espacio en memoria, al comportamiento en la ejecución de un programa o al SQL ANSI así como otras posiciones no se hicieron esperar. De la misma manera y, aún cuando todos hablen dentro del mismo contexto, a veces surgen dudas de si será esto o aquello, o si se comportará de una u otra manera.
Así que bueno, antes de continuar es importante precisar que el contexto aquí es desde la perspectiva y comportamiento de los NULL en las bases de datos Oracle (procuraré actualizarlo posteriormente con algunos otros motores).
Por supuesto, este post está inspirado en una entrada escrita por Lex de Haan y Jonathan Gennick (enlace) y sobre parte del libro Oracle PL/SQL Programming (6th edition) de Steven Feuerstein (@sfonplsql), excelente por cierto.
NULL
Este también es un valor, uno que indica completa ausencia de valor. 👀 Quizá puede sonar algo contradictorio pero es tal cual. Es decir, sería impreciso atribuir interpretaciones como "inexistente", "desconocido", etc., sin otras verificaciones según el contexto.
De la misma manera, es importante ser precavido con su uso al momento de escribir consultas o código PL/SQL. Para la muestra, algunos botones.
¿NULL o String vacío?
A diferencia de SQL Server, donde la expresión '' (doble apóstrofe) se conoce como un String vacío y difiere de la expresión NULL, en Oracle, las dos tienden a ser lo mismo, a tratarse como un NULL.
Existen, sin embargo, un par de excepciones y es que, dependiendo del tipo de dato en PL/SQL, la respuesta de una comparación puede variar.
SET SERVEROUTPUT ON
DECLARE
nullChar CHAR(2) := '';
nullVarchar VARCHAR2(2) := '';
isNull CHAR(1);
BEGIN
DBMS_OUTPUT.PUT_LINE('Comportamiento en tipo Char');
DBMS_OUTPUT.PUT_LINE('Cantidad de caracteres: '||LENGTH(nullChar));
IF nullChar IS NULL
THEN isNull := 'Y';
ELSE isNULL := 'N';
END IF;
DBMS_OUTPUT.PUT_LINE('¿Variable Char es NULL?: '||isNull);
isNull := NULL;
DBMS_OUTPUT.PUT_LINE(chr(10)||'Comportamiento en tipo Varchar2');
DBMS_OUTPUT.PUT_LINE('Cantidad de caracteres: '||LENGTH(nullVarchar));
IF nullVarchar IS NULL
THEN isNull := 'Y';
ELSE isNULL := 'N';
END IF;
DBMS_OUTPUT.PUT_LINE('¿Variable Varchar es NULL?: '||isNull);
END;
/
Aunque el mismo valor se asigna a las dos variables, una Varchar2 y una Char, el resultado muestra sólo la primera como NULL. También, al ejecutar una consulta para obtener el valor de '', el resultado es un NULL.
Bien, esto apenas fue un inicio, vendrán otros post con algunas pruebas en otros contextos como en el uso de funciones, operaciones aritméticas, etc.
Además habrá algunas otras temáticas así que espero que esto sea nutritivo para todos.
Gracias!!



Comentarios
Publicar un comentario
¿Quieres comentar? Adelante!! :)