Saltar al contenido

NULL no es FALSO: la lógica trivaluada de SQL

a OR NOT a es una tautología sobre dos valores, y el motor lo demuestra en las dos filas. En SQL, donde a puede ser NULL, la misma expresión es NULL, y una cláusula WHERE descarta la fila. NULL es un tercer valor, no una grafía de FALSO.

La comprobación de abajo es la de dos valores: a OR NOT a se cumple en todas las filas, hay dos filas, y la comprobación de contradicción encuentra el testigo a = FALSO en el que la fórmula es VERDADERA. Esa es toda la historia en la lógica booleana, y es la historia que cuenta el motor, porque su semántica tiene exactamente dos valores.

La lógica trivaluada de SQL añade NULL, que significa desconocido. NOT NULL es NULL; NULL OR NULL es NULL; así que a OR NOT a es NULL cuando a lo es. Las reglas del operando conocido siguen aplicándose, NULL OR TRUE es VERDADERO y NULL AND FALSE es FALSO, y por eso una condición a veces funciona en filas NULL y a veces las excluye en silencio. WHERE conserva solo las filas VERDADERAS, así que una condición NULL se comporta como FALSO ahí, mientras que las restricciones CHECK aceptan NULL como aprobado; la misma expresión, dos resultados.

La exportación a SQL del motor no finge lo contrario. Su plantilla de guarda marca cualquier fila con una entrada NULL como invalid_input y rellena las columnas de salida solo para las filas cuyas entradas son todas booleanos no nulos, y su cabecera prohíbe envolver los fragmentos en COALESCE(…, FALSE), que elegiría un significado que la regla nunca enunció. La página del lenguaje SQL describe la exportación.

always_true := a OR NOT a · salida

Tabla de verdad

NULL no es FALSO: la lógica trivaluada de SQL
#aalways_true
0FALSOVERDADERO
1VERDADEROVERDADERO

Lectura en lenguaje claro

Principiantealways_true es verdadero exactamente cuando a es verdadero o a es falso (o ambas cosas).
En todos los demás casos, always_true es falso.
Sobre los operadores:
- OR (O) es inclusivo: es verdadero en cuanto al menos una parte es verdadera, también cuando lo son varias.
- NOT (NO) invierte un valor: lo verdadero pasa a ser falso y lo falso, verdadero.
Intermedioalways_true es verdadero exactamente cuando a es verdadero o a es falso (o ambas cosas).
En todos los demás casos, always_true es falso.
Avanzadoalways_true es verdadero exactamente cuando a es verdadero o a es falso (o ambas cosas) [disyunción inclusiva ∨].
En todos los demás casos, always_true es falso.
Notación formal: a ∨ ¬a
NULL is not FALSE: three-valued logic in SQL NULL is not FALSE: three-valued logic in SQL a always_true OR NOT
NULL is not FALSE: three-valued logic in SQL NULL is not FALSE: three-valued logic in SQL a always_true OR NOT

El error habitual

Probar una regla en SQL con WHERE NOT banned y concluir que los usuarios no vetados son admitidos. Los usuarios cuyo banned es NULL no son ni admitidos ni rechazados por esa cláusula; faltan en los dos conjuntos de resultados, y solo un recuento de filas lo revela.

Preguntas

¿Puedo modelar NULL en Tangibool?

No como valor. El motor tiene dos valores de verdad por diseño. Modela «desconocido» de forma explícita como una entrada aparte (banned_known AND NOT banned), y las comprobaciones de dos valores cubren entonces los tres casos con honestidad.

¿IS NOT TRUE es lo mismo que NOT?

No. x IS NOT TRUE es VERDADERO cuando x es FALSO o NULL, mientras que NOT x es NULL cuando x lo es. Los predicados IS son la forma de SQL de hacer que NULL se comporte como un valor.

Relacionado

Ejemplos resueltos

Herramientas

Véase también

Errores comunes

Generado a partir del motor de Tangibool, semántica tangibool-semantics/1, motor 1.0.0, compilación . Cada tabla, mapa, simplificación y veredicto de estas páginas lo calculó el motor de Tangibool al compilar el sitio, y cada afirmación la volvió a comprobar el mismo verificador exacto que usa la app. Los límites se indican donde aplican. © 2026 Foreranger LTD.