not - postgresql if null then 0
IN Cláusula con NULL o IS NULL (6)
Postgres es la base de datos
¿Puedo usar un valor NULL para una cláusula IN? ejemplo:
SELECT *
FROM tbl_name
WHERE id_field IN (''value1'', ''value2'', ''value3'', NULL)
Quiero limitarme a estos cuatro valores.
He intentado la declaración anterior y no funciona, se ejecuta pero no agrega los registros con NULL id_fields.
También intenté agregar una condición OR, pero esto solo hace que la consulta se ejecute y se ejecute sin un final a la vista.
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND id_field IN (''value1'', ''value2'', ''value3'')
OR id_field IS NULL
¿Alguna sugerencia?
Una sentencia
in
se analizará de forma idéntica afield=val1 or field=val2 or field=val3
. Poner un nulo allí se reducirá afield=null
que no funcionará.
( Comment de Marc B )
Haría esto por clarividencia
SELECT *
FROM tbl_name
WHERE
(id_field IN (''value1'', ''value2'', ''value3'') OR id_field IS NULL)
La pregunta respondida por Daniel es muy buena. Quería dejar una nota sobre NULLS. Deberíamos tener cuidado con el uso del operador NOT IN cuando una columna contiene valores NULL. No obtendrá ningún resultado si su columna contiene valores NULL y está utilizando el operador NOT IN. Así es como se explica aquí http://www.oraclebin.com/2013/01/beware-of-nulls.html , un muy buen artículo que encontré y pensé en compartirlo.
Sé que es tarde para responder, pero podría ser útil para otra persona. Puede usar la subconsulta y convertir el valor nulo en 0
SELECT *
FROM (SELECT CASE WHEN id_field IS NULL
THEN 0
ELSE id_field
END AS id_field
FROM tbl_name) AS tbl
WHERE tbl.id_field IN (''value1'', ''value2'', ''value3'', 0)
Su consulta falla debido a la precedencia del operador . AND
une antes que OR
!
Necesitas un par de paréntesis, que no es una cuestión de "claridad", sino puramente lógica .
SELECT *
FROM tbl_name
WHERE other_condition = bar
AND another_condition = foo
AND (id_field IN (''value1'', ''value2'', ''value3'') OR id_field IS NULL)
Los paréntesis añadidos previenen el enlace AND
antes de OR
Si no hubiera otras condiciones WHERE
(sin AND
), no necesitaría paréntesis. La respuesta aceptada es un poco engañosa a este respecto.
Nota: Como alguien afirmó que el enlace externo estaba muerto en la respuesta de Sushant Butta, publiqué el contenido aquí como una respuesta separada.
Cuidado con NULLS .
Hoy encontré un comportamiento de consulta muy extraño al usar operadores IN y NOT IN
. En realidad, quería comparar dos tablas y averiguar si un valor de la table b
existía en la table a
ao no y conocer su comportamiento si la columna contiene valores null
. Así que acabo de crear un entorno para probar este comportamiento.
Crearemos la tabla table_a
.
SQL> create table table_a ( a number);
Table created.
Crearemos la tabla table_b
.
SQL> create table table_b ( b number);
Table created.
Inserta algunos valores en table_a
.
SQL> insert into table_a values (1);
1 row created.
SQL> insert into table_a values (2);
1 row created.
SQL> insert into table_a values (3);
1 row created.
Inserta algunos valores en table_b
.
SQL> insert into table_b values(4);
1 row created.
SQL> insert into table_b values(3);
1 row created.
Ahora ejecutaremos una consulta para verificar la existencia de un valor en table_a
verificando su valor de table_b
usando el operador IN
.
SQL> select * from table_a where a in (select * from table_b);
A
----------
3
Ejecute debajo de la consulta para verificar la inexistencia.
SQL> select * from table_a where a not in (select * from table_b);
A
----------
1
2
La salida fue como se esperaba. Ahora insertaremos un valor null
en la tabla table_b
y veremos cómo se comportan las dos consultas anteriores.
SQL> insert into table_b values(null);
1 row created.
SQL> select * from table_a where a in (select * from table_b);
A
----------
3
SQL> select * from table_a where a not in (select * from table_b);
no rows selected
La primera consulta se comportó como se esperaba, pero ¿qué pasó con la segunda consulta? ¿Por qué no obtuvimos ningún resultado? ¿Qué debería haber pasado? ¿Hay alguna diferencia en la consulta? No
El cambio está en los datos de la tabla table_b
. Hemos introducido un valor null
en la tabla. ¿Pero por qué se está comportando así? Dividamos las dos consultas en el operador "AND"
y "OR"
.
Primera consulta:
La primera consulta se manejará internamente algo así. Entonces, un null
no creará un problema aquí ya que mis dos primeros operandos se evaluarán como true
o como false
. Pero mi tercer operando a = null
no se evaluará como true
ni false
. Evaluará a null
solamente.
select * from table_a whara a = 3 or a = 4 or a = null;
a = 3 is either true or false
a = 4 is either true or false
a = null is null
Segunda consulta:
La segunda consulta se manejará de la siguiente manera. Dado que estamos utilizando un operador "AND"
y cualquier cosa que no sea true
en cualquiera de los operandos no me dará ningún resultado.
select * from table_a whara a <> 3 and a <> 4 and a <> null;
a <> 3 is either true or false
a <> 4 is either true or false
a <> null is null
Entonces, ¿cómo manejamos esto? table_b
todos los valores not null
de la tabla table_b
mientras usamos el operador NOT IN
.
SQL> select * from table_a where a not in (select * from table_b where b is not null);
A
----------
1
2
Así que siempre tenga cuidado con los valores NULL
en la columna mientras usa el operador NOT IN
.
¡Cuidado con NULL!
SELECT *
FROM tbl_name
WHERE coalesce(id_field,''unik_null_value'')
IN (''value1'', ''value2'', ''value3'', ''unik_null_value'')
Para que elimines el nulo del cheque. Dado un valor nulo en id_field, la función coalesce en lugar de null devolvería ''unik_null_value'', y al agregar ''unik_null_value a la lista IN, la consulta devolvería las publicaciones donde id_field es value1-3 o null.