Alguém poderia explicar o seguinte comportamento no SQL?
SELECT * FROM MyTable WHERE MyColumn != NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn <> NULL (0 Results)
SELECT * FROM MyTable WHERE MyColumn IS NOT NULL (568 Results)
sql
sql-server
tsql
null
Maxim Gershkovich
fonte
fonte
<>
que está no 92 especificação, mas a maioria dos fornecedores de suporte!=
e / ou está incluída em uma especificação mais tarde como 99 ou 03.!=
até ~ 9i, pelo que entendi, o que trouxe muita sintaxe ANSI-92. Minha crença é que o MySQL é semelhante, iniciando o suporte na versão 4.x.!=
poderia ter sido incluído em uma especificação posterior como uma alternativa a<>
. Não tenho minhas mãos em novas especificações, então não posso dizer com certeza.WHERE MyColumn != NULL
ouWHERE MyColumn = NULL
determinista? Ou, em outras palavras, é garantido o retorno sempre de 0 linhas, independentemente deMyColumn
ser nulo no banco de dados ou não?!=
apenas avalia valores, fazer algo comoWHERE MyColumn != 'somevalue'
não retornará os registros NULL.NULL não tem valor e, portanto, não pode ser comparado usando os operadores de valor escalar.
Em outras palavras, nenhum valor pode ser igual a (ou não) NULL porque NULL não tem valor.
Portanto, o SQL possui predicados especiais IS NULL e IS NOT NULL para lidar com NULL.
fonte
'a' != null
NÃO devolver um valor (true
/1
) é contra-intuitivo e me pega de vez em quando! Eu teria pensado que "algum valor comparado a nenhum valor" sempre seria "não igual", mas talvez seja apenas eu?!?SELECT * FROM MyTable WHERE coalesce(MyColumn, 'x') <> 'x'
atribuir uma constante se for um valor NULL, desde que você forneça um tipo de dados apropriado para o valor sentinela x (nesse caso, uma string / char). Essa é a sintaxe do TSQL, mas o Oracle e outros mecanismos têm recursos semelhantes.Observe que esse comportamento é o comportamento padrão (ANSI).
Se vocês:
http://msdn.microsoft.com/en-us/library/ms188048.aspx
Você obterá resultados diferentes.
SET ANSI_NULLS OFF
aparentemente vai desaparecer no futuro ...fonte
create unique index UK_MyTable on MyTable (Column) where Column is not null
): msdn.microsoft.com/en-us/library/cc280372.aspxSET ANSI_NULLS
está DESATIVADO, os operadores de comparação Igual a (=) e Diferente de (<>) não seguem o padrão ISO. Uma instrução SELECT que usaWHERE column_name = NULL
retorna as linhas que possuem valores nulos em column_name. Uma instrução SELECT que usaWHERE column_name <> NULL
retorna as linhas que possuem valores não nulos na coluna. Além disso, uma instrução SELECT que usaWHERE column_name <> XYZ_value
retorna todas as linhas que não são XYZ_value e que não são NULL. IMHO, esta última afirmação parece um pouco estranha na exclusão de valores nulos dos resultados!No SQL, qualquer coisa que você avalie / calcule com
NULL
resultados em DESCONHECIDOÉ por isso que
SELECT * FROM MyTable WHERE MyColumn != NULL
ouSELECT * FROM MyTable WHERE MyColumn <> NULL
fornece 0 resultados.Para fornecer uma verificação de
NULL
valores, a função isNull é fornecida.Além disso, você pode usar o
IS
operador como usou na terceira consulta.Espero que isto ajude.
fonte
O único teste para NULL é IS NULL ou NOT NULL. Testar a igualdade não faz sentido, porque, por definição, não se sabe qual é o valor.
Aqui está um artigo da Wikipedia para ler:
https://en.wikipedia.org/wiki/Null_(SQL)
fonte
Nós usamos
para retornar todas as linhas em que MyColumn é NULL ou todas as linhas em que MyColumn é uma sequência vazia. Para muitos "usuários finais", o problema de seqüência de caracteres NULL vs. vazio é uma distinção sem necessidade e ponto de confusão.
fonte
Eu simplesmente não vejo a razão funcional e perfeita para que os nulos não sejam comparáveis a outros valores ou outros nulos, porque podemos compará-lo claramente e dizer que eles são iguais ou não em nosso contexto. É engraçado. Só por causa de algumas conclusões lógicas e consistência, precisamos nos preocupar constantemente com isso. Não é funcional, torne-o mais funcional e deixe que filósofos e cientistas concluam se é consistente ou não e mantém a "lógica universal". :) Alguém pode dizer que é por causa de índices ou qualquer outra coisa, duvido que essas coisas não pudessem ser feitas para suportar nulos iguais aos valores. É o mesmo que comparar dois copos vazios, um é copo de vinho e outro é copo de cerveja; não estamos comparando os tipos de objetos, mas os valores que eles contêm, o mesmo que você pode comparar int e varchar, com nulo ' é ainda mais fácil, não é nada e o que dois nada têm em comum, eles são os mesmos, claramente comparáveis por mim e por todos os outros que escrevem sql, porque estamos constantemente quebrando essa lógica, comparando-os de maneiras estranhas por causa de alguns padrões ANSI. Por que não usar a energia do computador para fazer isso por nós e duvido que isso acelere as coisas se tudo relacionado for construído com isso em mente. "Não é nulo, não é nada", não é maçã, é apfel, vamos lá ... Funcionalmente é seu amigo e também há lógica aqui. No final, a única coisa que importa é a funcionalidade e o uso de nulos dessa maneira traz mais ou menos funcionalidade e facilidade de uso. É mais útil? porque estamos constantemente quebrando essa lógica, comparando-os de maneiras estranhas por causa de alguns padrões ANSI. Por que não usar a energia do computador para fazer isso por nós e duvido que isso acelere as coisas se tudo relacionado for construído com isso em mente. "Não é nulo, não é nada", não é maçã, é apfel, vamos lá ... Funcionalmente é seu amigo e também há lógica aqui. No final, a única coisa que importa é a funcionalidade e o uso de nulos dessa maneira traz mais ou menos funcionalidade e facilidade de uso. É mais útil? porque estamos constantemente quebrando essa lógica, comparando-os de maneiras estranhas por causa de alguns padrões ANSI. Por que não usar a energia do computador para fazer isso por nós e duvido que isso acelere as coisas se tudo relacionado for construído com isso em mente. "Não é nulo, não é nada", não é maçã, é apfel, vamos lá ... Funcionalmente é seu amigo e também há lógica aqui. No final, a única coisa que importa é a funcionalidade e o uso de nulos dessa maneira traz mais ou menos funcionalidade e facilidade de uso. É mais útil? s não maçã é apfel, vamos lá ... Funcionalmente é seu amigo e também há lógica aqui. No final, a única coisa que importa é a funcionalidade e o uso de nulos dessa maneira traz mais ou menos funcionalidade e facilidade de uso. É mais útil? s não maçã é apfel, vamos lá ... Funcionalmente é seu amigo e também há lógica aqui. No final, a única coisa que importa é a funcionalidade e o uso de nulos dessa maneira traz mais ou menos funcionalidade e facilidade de uso. É mais útil?
Considere este código:
Quantos de vocês sabem o que esse código retornará? Com ou sem NÃO, retorna 0. Para mim, isso não é funcional e é confuso. No c #, tudo é como deveria ser, as operações de comparação retornam valor, logicamente isso também produz valor, porque, se isso não acontecesse, não havia nada para comparar (exceto nada :):). Eles apenas "disseram": qualquer coisa comparada com "retornos" nulos 0 e que cria muitas soluções alternativas e dores de cabeça.
Este é o código que me trouxe aqui:
Eu só preciso comparar se dois campos (em onde) têm valores diferentes, eu poderia usar a função, mas ...
fonte
NULL Não pode ser comparado a nenhum valor usando os operadores de comparação. NULL = NULL é falso. Nulo não é um valor. O operador IS é especialmente projetado para lidar com comparações NULL.
fonte
null = null
onde alguém pode usar1=0
em alguma consulta ad-hoc. E se eles se queixam, eu mudar paranull != null
:)Pergunta antiga, mas o seguinte pode oferecer mais detalhes.
null
representa nenhum valor ou um valor desconhecido. Não especifica por que não há valor, o que pode levar a alguma ambiguidade.Suponha que você execute uma consulta como esta:
isto é, você está procurando linhas nas quais as datas
ordered
edelivered
são iguais.O que é esperado quando uma ou ambas as colunas são nulas?
Como pelo menos uma das datas é desconhecida, você não pode esperar dizer que as duas datas são iguais. Este também é o caso quando as duas datas são desconhecidas: como podem ser as mesmas se nem sabemos o que são?
Por esse motivo, qualquer expressão que trate
null
como um valor deve falhar. Nesse caso, não corresponderá. Este também é o caso se você tentar o seguinte:Novamente, como podemos dizer que dois valores não são os mesmos se não sabemos o que são.
SQL tem um teste específico para valores ausentes:
Especificamente, não está comparando valores, mas procura valores ausentes .
Finalmente, no que diz respeito ao
!=
operador, tanto quanto sei, ele não está de fato em nenhuma das normas, mas é amplamente suportado. Foi adicionado para fazer com que programadores de alguns idiomas se sintam mais à vontade. Francamente, se um programador tem dificuldade em lembrar qual idioma está usando, ele começa mal.fonte
NULL
queremos dizer que estamos comparando um valor a 'ter umNULL
valor', não o valor ao "valor indeterminado que o subjacenteNULL
está tendo? mas que não sabemos ", que obviamente não poderemos saber. Isso realmente facilitaria as coisas.IS NULL
seja muito mais árduo do que escrever= NULL
. Eu acho que seria mais consistente seWHERE columnA = columnB
tivesse a mesma interpretação queWHERE columnA = NULL
, em vez de tratar a última como um caso especial. Lembre-se que nãoNULL
é um valor. Nas linguagens de programação em que é legítimo testá- lo, é porque tem um significado diferente; não representa algo desconhecido, mas uma redefinição deliberada de um valor. Não é assim com o SQL.variable == null
null
IS NULL
AND=NULL
no seu exemplo mais recente. Mas dê uma olhada no último de Hover. Estou cansado de experimentar isso de novo e de novo, tendo que fazer muitas coisas desnecessárias? verificação extra ...Gostaria de sugerir esse código que fiz para descobrir se há uma alteração em um valor,
i
sendo o novo valor ed
o antigo (embora a ordem não importe). Nesse caso, uma mudança de valor para nulo ou vice-versa é uma mudança, mas de nulo para nulo não é (é claro, de valor para outro valor é uma mudança, mas de valor para o mesmo não é).Para usar esta função, você pode
Os resultados são:
O uso de sql_variant o torna compatível com vários tipos
fonte
NULL não é nada ... é desconhecido. NULL não é igual a nada. É por isso que você precisa usar a frase mágica IS NULL em vez de = NULL nas suas consultas SQL
Você pode consultar isso: http://weblogs.sqlteam.com/markc/archive/2009/06/08/60929.aspx
fonte