Estou trabalhando no código escrito por um desenvolvedor anterior e em uma consulta que diz:
WHERE p.name <=> NULL
O que <=>
significa nesta consulta? É algo igual a =
? Ou é um erro de sintaxe?
Mas não está mostrando nenhum erro ou exceção. Eu já sei isso <>
= !=
no MySQL .
mysql
sql
operators
spaceship-operator
zzlalani
fonte
fonte
spaceship
operadorRespostas:
TL; DR
É o operador
NULL
seguro igual .Como o
=
operador regular , dois valores são comparados e o resultado é0
(não igual) ou1
(igual); em outras palavras:'a' <=> 'b'
rendimentos0
e'a' <=> 'a'
rendimentos1
.Diferentemente do
=
operador regular , os valores deNULL
não têm um significado especial e, portanto, nunca produzemNULL
como um resultado possível; então:'a' <=> NULL
rendimentos0
eNULL <=> NULL
rendimentos1
.Utilidade
Isso pode ser útil quando os dois operandos podem conter
NULL
e você precisa de um resultado consistente de comparação entre duas colunas.Outro caso de uso é com instruções preparadas, por exemplo:
Aqui, o espaço reservado pode ser um valor escalar ou
NULL
sem precisar alterar nada sobre a consulta.Operadores relacionados
Além disso,
<=>
existem outros dois operadores que podem ser usados para compararNULL
, a saberIS NULL
eIS NOT NULL
; eles fazem parte do padrão ANSI e, portanto, são suportados em outros bancos de dados, ao contrário<=>
que é específico do MySQL.Você pode pensar nelas como especializações do MySQL
<=>
:Com base nisso, sua consulta específica (fragmento) pode ser convertida para a mais portátil:
Apoio, suporte
O padrão SQL: 2003 introduziu um predicado para isso, que funciona exatamente como o
<=>
operador do MySQL , da seguinte forma:O seguinte é universalmente suportado, mas é relativamente complexo:
fonte
<=>
é um operador um pouco inútil? certo?<=>
leva dois operandos enquantoIS (NOT) NULL
leva apenas um; grande diferença ... é tão útil quanto=
ela nesse aspecto.IS NULL
eIS NOT NULL
estão no padrão SQL.<=>
é uma extensão específica do MySQL.is not distinct from
operador. Curioso para saber se MySQL pode usar um índice em que ...a <=> b
éNOT(a <=> b)
.é <=>
NULL-safe equal to operator
Este operador executa uma comparação de igualdade como o operador =, mas retorna 1 em vez de NULL se ambos os operandos forem NULL e 0 em vez de NULL se um operando for NULL.
Veja aqui a documentação
Amostra:
você deve usar NÃO É NULL. (Os operadores de comparação = e <> fornecem UNKNOWN com NULL nos dois lados da expressão.)
também pode negar o operador de igualdade segura nula, mas esse não é o SQL padrão.
fonte
<=>
deve ser chamado de operador igual e=
é oNULL
operador igual inseguro.É o NULL-safe igual ao operador
O operador é usado para comparar valores NULL com os campos. Se normal = (igual) Os operadores retornam NULL se um dos valores de comparação for NULL. Com <=>, o operador retorna verdadeiro ou falso. O operador é igual a IS NULL.
Do manual: -
Edit: - ( Embora seja tarde demais para adicionar uma nota lateral importante mencionando NOT <=> também )
Em uma nota lateral: -
NÃO <=>
Há mais um ponto NOT <=> que é usado para comparar valores NULL com os campos. Se normal! = Ou <> (não é igual) Os operadores retornam NULL se um dos valores de comparação for NULL. Com NÃO aplicado a <=>, o operador retorna verdadeiro ou falso. NÃO aplicado ao operador <=> é o mesmo que NÃO É NULL.
Exemplo:-
fonte
NOT <=>
não é um operador, éNOT
aplicado ao resultado deop1 <=> op2
.<!=>
operador<=>
é o operador nulo seguro "igual a" do MySQL. Do manual :fonte
NULL-safe igual. Este operador executa uma comparação de igualdade como o operador =, mas retorna 1 em vez de NULL se ambos os operandos forem NULL e 0 em vez de NULL se um operando for NULL.
Seu significado:
Ao comparar um valor NULL com um valor não NULL, você obtém NULL. Se você deseja verificar se um valor é nulo.
O operador Igualdade (<=>), que considera NULL como um valor normal, retorna 1 (não NULL) se ambos os valores forem NULL e retorna 0 (não NULL) se um dos valores for NULL:
por exemplo
fonte
<=>
é o operador igual à segurança NULL .a <=> b
é o mesmo que escrever:E desculpe, não encontrei um bom motivo para usar esse operador em vez de
AND/OR IS (NOT) NULL
. Seu exemplo, por exemplo,WHERE p.name <=> NULL
é o mesmo queWHERE p.name IS NULL
.fonte
Na documentação do MySQL :
Um exemplo usando o
<=>
operador seria:O que retornaria:
Um exemplo do
=
operador regular seria:O que retornaria:
O
<=>
operador é muito semelhante ao=
operador, exceto<=>
que nunca retornaráNULL
fonte
É o operador NULL - Safe Igual ao operador. Verifique a descrição .
fonte
fonte