Un tipo de datos que siempre le faltó a Firebird fue el BOOLEAN… hasta ahora.

Desde siempre contábamos con los tipos de datos: SMALLINT, INTEGER, BIGINT, FLOAT, DOUBLE PRECISION, NUMERIC, DECIMAL, DATE, TIME, TIMESTAMP, CHAR, VARCHAR, BLOB, pero no contábamos con BOOLEAN, entonces si lo necesitábamos (algo muy frecuente al crear una tabla) lo simulábamos creando un dominio como el siguiente:

CREATE DOMAIN D_BOOLEAN AS
   CHAR(1)
      CHECK (VALUE = 'F' OR VALUE = 'T');

Funcionaba bien, claro que sí, pero no es realmente un tipo de datos BOOLEAN.

¿Por qué no?

Porque le faltan los predicados lógicos. Es decir las comparaciones por verdadero o falso.

Un ejemplo de lo que ahora podemos hacer:

UPDATE
   MiTabla
SET
   MiColumnaBoolean = (MiValor1 IS DISTINCT FROM MiValor2)

Una comparación puede darnos uno de estos tres resultados posibles:

  • Verdadero
  • Falso
  • Nulo o desconocido

(Recuerda que en SQL un valor nulo significa: “desconocido”)

En el ejemplo anterior, si MiValor1 es distinto de MiValor2 en MiColumnaBoolean se guardará Verdadero, ya que la condición se cumplió. Si alguno de esos valores era nulo entonces se guardará Desconocido (porque el resultado de comparar un valor desconocido con cualquier otro valor siempre es desconocido).

Valores posibles de una columna de tipo BOOLEAN

Si declaramos que una columna será de tipo BOOLEAN, en ella podremos guardar cualquiera de los siguientes valores:

  • TRUE
  • FALSE
  • UNKNOWN

TRUE significa “verdadero”, FALSE significa “falso” y UNKNOWN significa “desconocido”.

IMPORTANTE: podemos usar NULL o UNKNOWN, como nos guste más, ambas palabras son sinónimos y pueden usarse intercambiablemente, así que usar una u otra depende del gusto de cada quien.

El operador IS

Para hacer las comparaciones podemos usar el operador IS [NOT], escribiendo algo como:

MiColumna1 IS TRUE
MiColumna2 IS FALSE
MiColumna3 IS NOT TRUE
MiColumna4 IS NOT FALSE
MiColumna5 IS UNKNOWN
MiColumna6 IS NULL
MiColumna7 IS DISTINCT FROM MiColumna1

Los operadores de comparación

Además del operador IS que vimos en el apartado anterior, también podemos comparar con: “=”, “<“, “<=”, “>”, “>=”, “!=”, “<>”

Comparación abreviada

Cuando comparamos por “verdadero”, podemos escribir algo como:

WHERE
   MiColumnaBoolean1

Fíjate que no escribimos MiColumnaBoolean1 IS TRUE, ya que el IS TRUE está implícito. Podemos escribirlo, si queremos, pero no es necesario. Similarmente, para comparar con “falso” podríamos escribir:

WHERE
   NOT MiColumnaBoolean1

En este caso, la condición se cumplirá cuando el valor guardado en la columna MiColumnaBoolean1 sea “falso”. También podríamos haber escrito: MiColumnaBoolean1 IS FALSE, al igual que antes, es cuestión de gustos usar una forma u otra.

Valores devueltos por el comando SELECT

Cuando en la lista de columnas que muestra nuestro SELECT existe alguna de tipo BOOLEAN, los valores que podemos ver son los siguientes:

<true>

<false>

<null>

Convirtiendo un tipo de datos BOOLEAN a CHAR o VARCHAR

Solamente podemos convertir el valor de una columna de tipo BOOLEAN a CHAR o a VARCHAR, no se puede convertir a alguno de los demás tipos de datos.

Para ello, usamos la función CAST()

Ejemplo 1. Creando una tabla que tendrá una columna de tipo BOOLEAN

CREATE TABLE
   MiTabla (
      MiColumnaEntera   INTEGER,
      MiColumnaBoolean1 BOOLEAN
) ;

COMMIT;

Ejemplo 2. Insertando valores en una columna de tipo BOOLEAN

INSERT INTO
   MiTabla
      VALUES (1, TRUE);

INSERT INTO
   MiTabla
      VALUES (2, 5 IS DISTINCT FROM 4);

INSERT INTO
   MiTabla
      VALUES (3, NULL);

Ejemplo 3. Asignando valores a una columna de tipo BOOLEAN

UPDATE
   MiTabla
SET
   MiColumnaBoolean1=TRUE,
   MiColumnaBoolean2=FALSE,
   MiColumnaBoolean3=2=4,
   MiColumnaBoolean4=NULL,
   MiColumnaBoolean5=UNKNOWN,
   MiColumnaBoolean6=5 > 1
WHERE
   MiCondición

Ejemplo 4. Consultando los valores de una columna de tipo BOOLEAN

SELECT
   *
FROM
   MiTabla
WHERE
   MiColumnaBoolean1

Esta consulta nos mostrará todas las filas que tengan TRUE en la columna MiColumnaBoolean1.

Ejemplo 5. Consultando por FALSE

SELECT
   *
FROM
   MiTabla
WHERE
   MiColumnaBoolean1 IS FALSE

Ejemplo 6. Consultando por UNKNOWN

SELECT
   *
FROM
   MiTabla
WHERE
   MiColumnaBoolean1 IS UNKNOWN

SELECT
   *
FROM
   MiTabla
WHERE
   MiColumnaBoolean1 IS NULL

Conclusión:

Algo que siempre le había faltado a Firebird era tener un verdadero tipo de datos BOOLEAN, podíamos suplir esa carencia creando un dominio pero hacerlo así no era del todo completo. Ahora, con Firebird 3 sí ya tenemos un verdadero tipo de datos BOOLEAN.

Los resultados de una comparación pueden ser: “verdadero”, “falso”, “desconocido”. Y esos son justamente los valores que podemos guardar en una columna definida como de tipo BOOLEAN, aunque desde luego que usaremos las palabras reservadas: TRUE, FALSE, UNKNOWN.

Para las comparaciones podemos usar el operador IS [NOT] o los operadores de comparación matemáticos.

El resultado de un SELECT que contenga columnas de tipo BOOLEAN puede ser: <true>, <false>, <null>

Recuerda que NULL en SQL significa “desconocido”, y la palabra UNKNOWN también significa “desconocido”, por eso pueden usarse como sinónimos.

Artículos relacionados:

¿Por qué Firebird 3?

Los archivos de configuración del Firebird 3

Entendiendo a los plug-in del Firebird 3

Parametrizando el archivo DATABASES.CONF

Agregando el usuario SYSDBA en Firebird 3

El índice del blog Firebird21

El foro del blog Firebird21