2010-03-06 21 views
15
CREATE TABLE `mycompare` (
    `name` varchar(100) default NULL, 
    `fname` varchar(100) default NULL, 
    `mname` varchar(100) default NULL, 
    `lname` varchar(100) default NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `mycompare` VALUES('amar', 'ajay', 'shankar', NULL); 
INSERT INTO `mycompare` VALUES('akbar', 'bhai', 'aslam', 'akbar'); 
INSERT INTO `mycompare` VALUES('anthony', 'john', 'Jim', 'Ken'); 
_____ 

SELECT * FROM mycompare WHERE (name = fname OR name = mname OR name = lname) 
akbar bhai aslam akbar 

select * from mycompare where !(name = fname OR name = mname OR name = lname) 
anthony john Jim Ken 

En la segunda selección anterior, espero que el registro "amar" también porque ese nombre no coincide con el nombre, el segundo o el apellido.Comparando con valores NULL

Respuesta

28

Cualquier comparación con NULL produce NULL. Para superar esto, hay tres operadores que puede utilizar:

  • x IS NULL - determina si la expresión de la izquierda es NULL,
  • x IS NOT NULL - como la de arriba, sino todo lo contrario,
  • x <=> y - compara dos operandos por la igualdad de manera segura, es decir, NULL se ve como un valor normal.

Para su código, es posible que desee considerar el uso de la tercera opción e ir con el nula comparación segura:

SELECT * FROM mycompare 
WHERE NOT(name <=> fname OR name <=> mname OR name <=> lname) 
+0

Más información: [Funciones de comparación de MySQL y Operadores] (http: //dev.mysql. com/doc/refman/5.7/es/comparison-operators.html) – IvanRF

2

NULL los valores se omiten automáticamente si se hace una comparación de valores (porque NULL no es un valor). Su cláusula where significa básicamente: compare los valores de los campos mencionados, si tienen un valor - de otro modo falso.

Tendría que incluir un cheque por separado para NULL si quiere esas filas, también.

1

Probablemente se podría conseguir lejos con algo como lo siguiente (suponiendo que NULL asignación a '' no es un problema):

SELECT * FROM mycompare 
WHERE (ifnull(name,'') = ifnull(fname,'') 
     OR ifnull(name,'') = ifnull(mname,'') 
     OR ifnull(name,'') = ifnull(lname,'')); 

select * from mycompare 
where !(ifnull(name,'') = ifnull(fname,'') 
     OR ifnull(name,'') = ifnull(mname,'') 
     OR ifnull(name,'') = ifnull(lname,'')); 
3

que tenía el mismo problema cuando estaba escribiendo disparadores de actualización y quería ejecutar parte de código solo cuando dos valores diferente. Usando IS NULL y XOR fue muy útil:

SELECT 1!=1;       -- 0 
SELECT 1!=2;       -- 1 
SELECT 1!=NULL;      -- NULL 
SELECT NULL!=NULL;     -- NULL 
SELECT NULL IS NULL XOR 1 IS NULL; -- 1 
SELECT NULL IS NULL XOR NULL IS NULL; -- 0 
SELECT 1 IS NULL XOR 1 IS NULL;  -- 0 

Así que he terminado usando:

IF (OLD.col != NEW.col) OR ((OLD.col IS NULL) XOR (NEW.col IS NULL)) THEN ...