mysql relational operators




O que é esse operador<=> no MySQL? (6)

Estou trabalhando em código escrito por um desenvolvedor anterior e em uma consulta 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 que <> = != No MySQL .


Similaridade com = operador

Como o operador normal = , dois valores são comparados e o resultado é 0 (não igual) ou 1 (igual); em outras palavras: 'a' <=> 'b' produz 0 e 'a' <=> 'a' produz 1 .

Diferença com o operador =

Ao contrário do operador regular = , os valores de NULL não têm um significado especial e, portanto, nunca resultam em NULL como um resultado possível; então: 'a' <=> NULL produz 0 e NULL <=> NULL produz 1 .

Ao contrário de = , em que 'a' = NULL produz NULL e até NULL = NULL produz NULL ; BTW, quase todos os operadores e funções no MySQL funcionam dessa maneira, porque a comparação com o NULL é basicamente indefinida.

Utilidade

Isso é muito útil quando os dois operandos podem conter NULL e você precisa de um resultado de comparação consistente entre duas colunas.

Outro caso de uso é com instruções preparadas, por exemplo:

... WHERE col_a <=> ? ...

Aqui, o espaço reservado pode ser um valor escalar ou NULL sem ter que alterar nada sobre a consulta.

Operadores relacionados

Além de <=> há também dois outros operadores que podem ser usados ​​para comparar com o NULL , ou seja, IS NULL e IS NOT NULL ; eles são parte do padrão ANSI e, portanto, suportados em outros bancos de dados, ao contrário de <=> , que é específico do MySQL.

Você pode pensar nelas como especializações do <=> do MySQL:

'a' IS NULL     ==> 'a' <=> NULL
'a' IS NOT NULL ==> NOT('a' <=> NULL)

Com base nisso, sua consulta específica (fragmento) pode ser convertida para a mais portátil:

WHERE p.name IS NULL

É o NULL-safe igual ao operador

<=> O operador é usado para comparar valores NULL com os campos. Se normal = (igual a) Os operadores retornam NULL se um dos valores de comparação for NULL. Com <=> o operador retorna verdadeiro ou falso. <=> Operador é o mesmo que IS NULL.

Do manual: -

<=> realiza 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.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL

Edit: - ( Apesar de muito tarde para adicionar uma nota importante que menciona NÃO <=> também )

Em uma nota lateral: -

NÃO <=>

Há mais um ponto NÃO <=> que é usado para comparar valores NULL com os campos. Se normal! = Ou <> (não é igual a) Os operadores retornam NULL se um dos valores de comparação for NULL. Com NOT aplicado ao <=> o operador retorna verdadeiro ou falso. NÃO aplicado ao <=> Operador é o mesmo que IS NOT NULL.

Exemplo:-

SELECT NULL != NULL,         //--Result is NULL
   NOT NULL <=> NULL,        //--Result is 0
   NULL IS NOT NULL;         //--Result is 0

é <=> NULL-safe equal to operator

Esse operador executa uma comparação de igualdade como o operador =, mas retorna 1 em vez de NULL, se os dois operandos forem NULL e 0, em vez de NULL, se um dos operandos for NULL.

Veja aqui a documentation

Amostra:

você deve usar IS NOT NULL. (Os operadores de comparação = e <> ambos fornecem UNKNOWN com NULL em ambos os lados da expressão.)

SELECT * 
FROM table 
WHERE YourColumn IS NOT NULL;

também pode negar o operador de igualdade segura nulo, mas isso não é SQL padrão.

SELECT *
FROM table 
WHERE NOT (YourColumn <=> NULL);

Da documentação do MySQL :

NULL-safe igual. Esse operador executa uma comparação de igualdade como o operador =, mas retorna 1 em vez de NULL, se os dois operandos forem NULL e 0, em vez de NULL, se um dos operandos for NULL.

Um exemplo usando o operador <=> seria:

SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;

Qual retornaria:

1, 1, 0

Um exemplo do operador regular = seria:

SELECT 1 = 1, NULL = NULL, 1 = NULL;

Qual retornaria:

1, NULL, NULL

O operador <=> é muito semelhante ao operador = , exceto que <=> nunca retornará NULL


<=> é o operador igual a NULL . a <=> b é o mesmo que escrever:

CASE
    WHEN a IS NULL AND b IS NULL THEN 1 -- both operands null then 1
    WHEN a IS NULL OR  b IS NULL THEN 0 -- one operand is null then 0
    ELSE a = b                          -- else behave like normal = operator
END

E desculpe, eu não consegui encontrar uma boa razão para usar este operador ao invés de AND/OR IS (NOT) NULL . Seu exemplo, por exemplo, WHERE p.name <=> NULL é o mesmo que WHERE p.name IS NULL .


<=> é o operador "igual a" sem erros do MySQL. Do manual :

NULL-safe igual. Esse operador executa uma comparação de igualdade como o operador =, mas retorna 1 em vez de NULL, se os dois operandos forem NULL e 0, em vez de NULL, se um dos operandos for NULL.

mysql> SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL;
        -> 1, 1, 0
mysql> SELECT 1 = 1, NULL = NULL, 1 = NULL;
        -> 1, NULL, NULL






spaceship-operator