2009-04-28 28 views
67

me gustaría evitar tener muchos controles como el siguiente en mi código:equivalente a SQLite ISNULL(), NVL(), IFNULL() o COALESCE()

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

que pensé que sólo pudiera tener mi consulta cuidar de los nulos haciendo algo como esto:

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

estoy usando SQLite y aunque no parece reconocer la función isnull. También he probado 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 sabe de una mejor manera de hacerlo? Lamentablemente, la base de datos no tiene valores predeterminados para todos los campos. Además, necesito usar algunas cláusulas LEFT JOIN en algunos casos, donde algunos de los campos devueltos serán nulos porque el registro coincidente en la tabla LEFT JOIN no existirá.

Respuesta

96

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

sin paréntesis angulares alrededor de la función

+0

Bah fueron los corchetes. Gracias por eso. Me estaba volviendo loco que la documentación decía que era compatible (también se fusionó allí), pero no funcionaba. Uno de esos días ... –

18

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

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END 

Esto funciona de la misma como ISNULL(fieldname, 0).

+1

La función 'ifnull' es el equivalente de SQLite de la función' isnull' sobre la que preguntaba la pregunta. Para cualquiera que lea esto ahora, vea la respuesta de SQLMenace (sin embargo, más de un año y medio antes) antes de escribir su propia solución usando 'CASE'. – spaaarky21

+0

@ spaaarky21 - Haces un buen punto. Sin embargo, esta respuesta es útil para aquellos que potencialmente usan sqlite solo para pruebas unitarias y que usan un RDBMS diferente para código en vivo. En ese caso, usar algo como las sentencias 'CASE' podría tener más sentido que' IFNULL'. –

+1

@sethflowers Puedo ver el valor de implementar valores predeterminados nulos en una forma más independiente de RDBMS, pero esa es la respuesta a una pregunta diferente. :) El OP simplemente está pidiendo el equivalente de SQLite a 'isnull' en otros sistemas y no quisiera animar a la gente a" hacer lo propio ". – spaaarky21

30

probar este

ifnull(X,Y) 

por ejemplo

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

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

+0

Sí, me di cuenta de que era 'ifnull' lo que quería ... Solo necesitaba soltar los corchetes que estaba usando. –

+1

¿Por qué mi respuesta está siendo rechazada? –

+0

@HardikDarji Porque algún administrador feliz downvote vio las palabras "prueba esto" y no leyó más. O bien, porque alguien asumió erróneamente que su comparación de ifnull() a coalesce() es errónea, como lo sería en otros entornos db (pero no en sqlite). En cualquier caso, a quién le importa. Las respuestas de "prueba esto" son mejores que las respuestas de "lee la documentación". Descremada sin código que contiene respuestas/ni siquiera las leí, cada vez. ¡Gracias por la respuesta! – maplemale

-2

Se puede definir fácilmente dicha función y utilizarlo a continuación:

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

o misma versión miniaturizada:

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

Eso no es SQLite. –

2

Uso IS NULL o IS NOT NULL en WHERE cláusula método() en lugar de ISNULL:

SELECT myField1 
FROM myTable1 
WHERE myField1 IS NOT NULL 
+0

Por favor, edite con más información. Se desalientan las respuestas de solo código y "prueba esto", ya que no contienen contenido que se pueda buscar y no explican por qué alguien debe "probar esto". – abarisone

+0

Eso no es relevante para lo que se pidió. El OP no desea filtrar las filas donde 'myField1' tiene un valor no nulo, quiere reemplazar el valor en la columna de resultados por uno diferente, si el valor de la fila es nulo. –

Cuestiones relacionadas