CASESPECIFIC… OR NOT?

En su funcionamiento por defecto, Teradata, a diferencia de otros RDBMS como Oracle, trata los textos CHAR Y VARCHAR en formato ‘CASE INSENSITIVE’ (esto es: considera indistinto el uso de mayúsculas o minúsculas). El caso es que este funcionamiento puede ser alterado (por motivos de compatibilidad, negocio etc…) utilizando la cláusula ‘CASESPECIFIC’. Utilizando esta cláusula haremos que para la columna así definida ya no sea igual utilizar las mayúsculas o minúsculas… y por ello las comparaciones (en ‘WHEREs’, por ejemplo) que se refieran a ellas comenzarán a tener el cuenta el caso.

Vamos a ver cómo se comportan las comparaciones cubriendo todos los casos posibles. Para ello utilizaremos cuatro ‘queries’ simples con una sola letra:

SELECT 1 WHERE CAST(‘A’ AS NOT CASESPECIFIC) = CAST(‘A’ AS CASESPECIFIC);
SELECT 1 WHERE CAST(‘A’ AS NOT CASESPECIFIC) = CAST(‘a’ AS CASESPECIFIC);
SELECT 1 WHERE CAST(‘a’ AS NOT CASESPECIFIC) = CAST(‘A’ AS CASESPECIFIC);
SELECT 1 WHERE CAST(‘a’ AS NOT CASESPECIFIC) = CAST(‘a’ AS CASESPECIFIC);

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT 1 WHERE CAST('A' AS NOT CASESPECIFIC) = CAST('A' AS CASESPECIFIC);

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

   1
----
   1

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT 1 WHERE CAST('A' AS NOT CASESPECIFIC) = CAST('a' AS CASESPECIFIC);

 *** Query completed. No rows found.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT 1 WHERE CAST('a' AS NOT CASESPECIFIC) = CAST('A' AS CASESPECIFIC);

 *** Query completed. No rows found.
 *** Total elapsed time was 1 second.

 BTEQ -- Enter your SQL request or BTEQ command:
SELECT 1 WHERE CAST('a' AS NOT CASESPECIFIC) = CAST('a' AS CASESPECIFIC);

 *** Query completed. One row found. One column returned.
 *** Total elapsed time was 1 second.

   1
----
   1

Así pues, el factor ‘CASESPECIFIC’ es limitante, pues la comparación se ejecuta en función de él al ser el más restrictivo. Por lo tanto: mucho ojito en la comparación de columnas CASESPECIFIC con NOT CASESPECIFIC, ya que podemos encontrarnos con resultados inesperados: con que una de las dos sea CASESPECIFIC se producirá el efecto descrito en el ejemplo.

Nota: El funcionamiento del ejemplo está basado en el modo ‘nativo’ Teradata. El modo ANSI es por definición ‘CASESPECIFIC’ y para alterar este funcionamiento Teradata permite utilizar la cláusula ‘NOT CASESPECIFIC’. Esto hará que para las comparaciones la casuística será similar a la explicada.

Saludos.

Carlos.

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: