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

92

Eu gostaria de evitar muitas verificações como a seguinte em meu código:

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

Achei que poderia simplesmente fazer minha consulta cuidar dos nulos fazendo algo assim:

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

Estou usando o SQLite e ele não parece reconhecer a isnullfunção. Também tentei alguns equivalentes reconhecidos em outros bancos de dados ( NVL(), IFNULL()e COALESCE()), mas o SQLite não parece reconhecer nenhum deles.

Alguém tem alguma sugestão ou conhece a melhor maneira de fazer isso. Infelizmente, o banco de dados não possui valores padrão para todos os campos. Além disso, preciso usar algumas LEFT JOINcláusulas em alguns casos, em que alguns dos campos retornados serão nulos porque o registro correspondente na LEFT JOINtabela não existirá.

Jason Down
fonte

Respostas:

130

IFNULL, veja aqui: http://www.sqlite.org/lang_corefunc.html#ifnull

sem colchetes ao redor da função

SQLMenace
fonte
Bah, eram os colchetes. Obrigado por isso. Estava me deixando louco que a documentação dizia que era compatível (também tem coalescer lá), mas não estava funcionando. Um daqueles dias ...
Jason Down
1
Sei que sua descrição de "sem colchetes ao redor da função" faz referência à pergunta, mas com uma afirmação como essa, ajudaria ter um exemplo abaixo de sua afirmação inicial.
palswim de
40

Tente isto

ifnull(X,Y)  

por exemplo

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

A ifnull()função retorna uma cópia de seu primeiro argumento diferente de NULL, ou NULL se ambos os argumentos forem NULL. Ifnull()deve ter exatamente 2 argumentos. A ifnull()função é equivalente a coalesce()dois argumentos.

Hardik Darji
fonte
1
Sim, descobri que era o que ifnulleu queria ... Só precisava retirar os colchetes que estava usando.
Jason Down
@HardikDarji Porque algum administrador feliz com votos negativos viu as palavras "tente isso" e não leu mais. Ou porque alguém presumiu erroneamente que sua comparação de ifnull () com coalesce () está errada, como seria em outros ambientes db (mas não em sqlite). Em qualquer caso, quem se importa. Respostas "Tente isto" são melhores do que respostas "leia a documentação". Vou folhear as respostas que não contêm código / nem mesmo as ler, todas as vezes. Obrigado pela resposta!
maplemale
25

Se não houver ISNULL()método, você pode usar esta expressão em seu lugar:

CASE WHEN fieldname IS NULL THEN 0 ELSE fieldname END

Isso funciona da mesma forma que ISNULL(fieldname, 0).

Mahdi Mohajer
fonte
1
A função ifnullé o equivalente SQLite da isnullfunção sobre a qual a pergunta estava perguntando. Para quem está lendo isso agora, consulte a resposta do SQLMenace (de mais de um ano e meio antes, no entanto) antes de escrever sua própria solução usando CASE.
spaaarky21 de
1
@ spaaarky21 - Você tem razão. No entanto, esta resposta é útil para aqueles que potencialmente usam sqlite apenas para teste de unidade e usam um RDBMS diferente para código ativo. Nesse caso, usar algo como CASEdeclarações pode fazer mais sentido do que IFNULL.
Seth Flowers de
2
@sethflowers Eu posso ver o valor na implementação de valores padrão nulos de uma forma mais neutra em RDBMS, mas essa é a resposta para uma pergunta diferente. :) O OP está simplesmente pedindo o equivalente do SQLite isnullem outros sistemas e eu não gostaria de encorajar as pessoas a "criarem seus próprios".
spaaarky21
Eu estava apenas procurando por algo como ifnotnull () ou ifnonnull () para complementar ifnull (), para uso na concatenação de string dentro da cláusula SELECT para exibir "last_name, first_name", mas apenas concatenar a vírgula se first_name for não nulo. Essa abordagem me permite fazer isso.
steve_0804
3

Use IS NULLou IS NOT NULLna cláusula WHERE em vez do método ISNULL ():

SELECT myField1
FROM myTable1
WHERE myField1 IS NOT NULL
Thilo
fonte
Edite com mais informações. Respostas somente código e "tente isto" são desencorajadas, porque não contêm conteúdo pesquisável e não explicam por que alguém deveria "tentar isso".
abarisone
1
Isso não é relevante para o que foi perguntado. O OP não quer filtrar as linhas que myField1possuem um valor não nulo, ele deseja substituir o valor na coluna de resultado por um diferente, se o valor da linha for nulo.
Daniel Kamil Kozar,
2

Para o equivalente a NVL () e ISNULL (), use:

IFNULL(column, altValue)

column : A coluna que você está avaliando.

altValue : O valor que você deseja retornar se 'coluna' for nulo.

Exemplo:

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

* Nota: A função COALESCE () funciona da mesma forma que para outros bancos de dados.

Fontes:

lewdev
fonte
-4

Você pode definir facilmente essa função e usá-la em seguida:

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

ou a mesma versão reduzida:

ifnull <- function(x,y) {if(is.na(x)==TRUE) return (y) else return (x);}
Stas Prihod'co
fonte
4
Isso não é SQLite.
Daniel Kamil Kozar,