Hoje aprendi que SELECT f1,EXISTS(SELECT ...),f2
é válido no MySQL e, lendo do StackOverflow, aparentemente também no PostgreSQL e a EXISTS
parte é 0 quando o resultado da subconsulta está vazio e 1 quando o resultado não está. Aí comecei a pensar e testei algumas querys parecendo SELECT * WHERE column1 - column2
e até essa funcionou e é igual a column1 <> column2
. E eu até tentei WHERE (column1 > 0) - column2
e até isso funcionou. Este é o padrão SQL ou apenas o MySQL é acionado para lançar booleanos e inteiros com abandono selvagem? Ou talvez os booleanos nem existam no SQL e 0/1 os represente?
relate perguntas
-
Existem ferramentas de benchmarking do MySQL? [fechado]
-
Onde posso encontrar o log lento do mysql?
-
Como posso otimizar um mysqldump de um banco de dados grande?
-
Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?
-
Como um grupo pode rastrear alterações no esquema do banco de dados?
boolean
do existe no padrão SQL, mas como booleanos "reais".Assim, os literais booleanos válidos são
false
outrue
.MySQL na verdade não suporta
boolean
valores. Ele simplesmente trata qualquer coisa que não possa ser convertida em um número diferente de zero como "falso".Por exemplo
é aceito como válido (mesmo que seja um SQL inválido) e é equivalente a
where false
porquexxxx
não pode ser convertido em um número e, portanto, é considerado o0
que é tratado comofalse
.Por outro lado
é tratado como
where true
porque42xxx
será (implicitamente) convertido para o42
qual, por sua vez, é tratado como "verdadeiro".A pergunta:
é SQL padrão inválido porque produz um número (assumindo que column1 e column2 são números) e um número não é uma expressão booleana.
Você pode ver esse comportamento ao fazer:
O MySQL retorna o número,
1
enquanto um banco de dados com suporte a booleanos reais (por exemplo, Postgres) retornarátrue
. O Oracle não oferece suporte a booleanos reais, portanto,select 1 > 0 from dual
é realmente inválido lá.