then not equivalente sql postgresql null condition in-clause

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 a field=val1 or field=val2 or field=val3 . Poner un nulo allí se reducirá a field=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.