SQLite equivalente a ISNULL (), NVL (), IFNULL () o COALESCE ()

92

Me gustaría evitar tener muchas verificaciones como las siguientes en mi código:

myObj.someStringField = rdr.IsDBNull(someOrdinal) 
                            ? string.Empty 
                            : rdr.GetString(someOrdinal);

Pensé que podría hacer que mi consulta se encargara de los nulos haciendo algo como esto:

SELECT myField1, [isnull](myField1, '') 
FROM myTable1
WHERE myField1 = someCondition

Sin embargo, estoy usando SQLite y no parece reconocer la isnullfunción. También probé algunos equivalentes reconocidos en otras bases de datos ( NVL(),IFNULL() y COALESCE()), pero SQLite no parece reconocer ninguno de ellos.

¿Alguien tiene alguna sugerencia o conoce una mejor manera de hacer esto? Desafortunadamente, la base de datos no tiene valores predeterminados para todos los campos. Además, necesito usar algunas LEFT JOINcláusulas en algunos casos, donde algunos de los campos devueltos serán nulos porque el registro coincidente en la LEFT JOINtabla no existirá.

Jason Down
fuente

Respuestas:

130

IFNULL, consulte aquí: http://www.sqlite.org/lang_corefunc.html#ifnull

sin corchetes alrededor de la función

SQLMenace
fuente
Bah, fueron los corchetes. Gracias por eso. Me estaba volviendo loco que la documentación dijera que era compatible (también se ha fusionado allí), pero no estaba funcionando. Uno de esos días ...
Jason Down
1
Me doy cuenta de que su descripción de "sin corchetes alrededor de la función" hace referencia a la pregunta, pero con una declaración como esa, sería útil tener un ejemplo debajo de su declaración inicial.
palswim
40

Prueba esto

ifnull(X,Y)  

p.ej

select ifnull(InfoDetail,'') InfoDetail; -- this will replace null with ''
select ifnull(NULL,'THIS IS NULL');-- More clearly....

La ifnull()función devuelve una copia de su primer argumento no NULL, o NULL si ambos argumentos son NULL. Ifnull()debe tener exactamente 2 argumentos. La ifnull()función es equivalente a coalesce()con dos argumentos.

Hardik Darji
fuente
1
Sí, me di cuenta de que era lo ifnullque quería ... Solo necesitaba eliminar los corchetes que estaba usando.
Jason Down
@HardikDarji Porque un administrador feliz que votó negativamente vio las palabras "prueba esto" y no leí más. O, porque alguien asumió erróneamente que su comparación de ifnull () con coalesce () es errónea, como sería en otros entornos de base de datos (pero no en sqlite). En cualquier caso, a quién le importa. Las respuestas de "Prueba esto" son mejores que las de "leer la documentación". Examinaré las respuestas que no contienen código / ni siquiera las leeré, cada vez. ¡Gracias por la respuesta!
maplemale
25

Si no hay un ISNULL()método, puede usar esta expresión en su lugar:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Esto funciona igual que ISNULL(fieldname, 0).

Mahdi Mohajer
fuente
1
La función ifnulles el equivalente SQLite de la isnullfunción sobre la que preguntaba la pregunta. Para cualquiera que lea esto ahora, consulte la respuesta de SQLMenace (de más de un año y medio antes) antes de escribir su propia solución usando CASE.
spaaarky21
1
@ spaaarky21 - Tienes un buen punto. Sin embargo, esta respuesta es útil para aquellos que potencialmente usan sqlite solo para pruebas unitarias y usan un RDBMS diferente para el código en vivo. En ese caso, usar algo como CASEdeclaraciones podría tener más sentido que IFNULL.
Seth Flowers
2
@sethflowers Puedo ver el valor de implementar valores predeterminados nulos de una manera más neutral a RDBMS, pero esa es la respuesta a una pregunta diferente. :) El OP simplemente está pidiendo el equivalente de SQLite isnullen otros sistemas y no quisiera animar a la gente a "lanzar el suyo".
spaaarky21
Solo estaba buscando algo como ifnotnull () o ifnonnull () para complementar ifnull (), para usar en la concatenación de cadenas dentro de la cláusula SELECT para mostrar "last_name, first_name" pero solo concatenar la coma si first_name no es nulo. Este enfoque me permite hacer eso.
steve_0804
3

Utilice IS NULLo IS NOT NULLen la cláusula WHERE en lugar del método ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL
Thilo
fuente
Edite con más información. No se recomiendan las respuestas de solo código y "probar esto", porque no contienen contenido que se pueda buscar y no explican por qué alguien debería "probar esto".
abarisone
1
Eso no es relevante para lo que se preguntó. El OP no quiere filtrar las filas donde myField1tiene un valor no nulo, quiere reemplazar el valor en la columna de resultados con uno diferente, si el valor de la fila es nulo.
Daniel Kamil Kozar
2

Para el equivalente de NVL () e ISNULL () use:

IFNULL(column, altValue)

column : La columna que está evaluando.

altValue : El valor que desea devolver si 'columna' es nulo.

Ejemplo:

SELECT IFNULL(middle_name, 'N/A') FROM person;

* Nota: La función COALESCE () funciona igual que con otras bases de datos.

Fuentes:

lewdev
fuente
-4

Puede definir fácilmente dicha función y usarla luego:

ifnull <- function(x,y) {
  if(is.na(x)==TRUE) 
    return (y)
  else 
    return (x);
}

o la misma versión minificada:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}
Stas Prihod'co
fuente
4
Eso no es SQLite.
Daniel Kamil Kozar