Saltar al contenido

Postgres SQL Exclusive OR (XOR) CHECK RESTRRAINT, ¿es posible?

Solución:

Correcto, el a = NULL y b = NULL bit fue el problema como se indicó en @a_horse_with_no_name. También puede considerar este derivado, que no requiere el OR operador:

create table test 
(
  id integer primary key, 
  a integer, 
  b integer, 
  check ((a IS NULL) != (b IS NULL))
);

Por supuesto que funciona exclusivamente con solo dos columnas. XOR comparación. Con tres o más columnas XOR En comparación con una tabla de prueba similar, podría recurrir a un enfoque similar más parecido a este:

create table test 
(
  id integer primary key, 
  a integer, 
  b integer, 
  c integer, 
  check ((a IS NOT NULL)::INTEGER + 
         (b IS NOT NULL)::INTEGER + 
         (c IS NOT NULL)::INTEGER = 1)
);

No puedes comparar valores NULL con =, necesitas IS NULL

(a IS NOT NULL AND b is NULL) OR (b IS NOT NULL AND a is NULL)

Para una restricción de verificación, debe encerrar toda la expresión entre paréntesis:

create table xor_test 
(
  id integer primary key, 
  a integer, 
  b integer, 
  check ((a IS NOT NULL AND b is NULL) OR (b IS NOT NULL AND a is NULL))
);

-- works
INSERT INTO xor_test(id, a, b) VALUES (1, null, 1);

-- works
INSERT INTO xor_test(id, a, b) VALUES (2, 1, null);

-- failse
INSERT INTO xor_test(id, a, b) VALUES (3, 1, 1); 

Alternativamente, la restricción de verificación se puede simplificar para

check ( num_nonnulls(a,b) = 1 )

También es más fácil de ajustar a más columnas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *