Na lista aqui:
https://mariadb.com/kb/en/operator-precedence/
case-expressions são colocadas no mesmo nível de precedência que BETWEEN
, entre o NOT
operador e os operadores de comparação.
No entanto, as expressões case sempre começam CASE
e terminam com END
, e todas as subexpressões também são delimitadas pelas palavras- CASE
chave. Eles são como expressões entre parênteses, então não entendo por que as expressões de maiúsculas e minúsculas estão nesta lista.
Existe uma expressão SQL que seria analisada de forma diferente se a precedência da expressão de maiúsculas e minúsculas fosse definida como maior ou menor?
Para dar um exemplo, com 2 + 3 * 4
, obtemos resultados diferentes quando os parênteses são usados dessas 2 maneiras: 2 + (3 * 4)
e (2 + 3) * 4
. Esta pergunta é sobre como é impossível fazer o mesmo com arquivos CASE
. Não se pode substituir o uso de +
for CASE
e mostrar 2 usos diferentes de parênteses de modo que o resultado seja diferente entre eles.
Para comparar com outros RDBMSes, nem o SQLite nem o PostgreSQL incluem CASE
em suas listas de precedência de operadores.
A documentação é assim porque é um reflexo preciso desta parte do código-fonte :
Isso apesar de como o analisador se comporta. Apesar de como, por exemplo,
1 + NOT 0
gera um erro de sintaxe por seguir um operador de alta precedência com um de menor precedência,1 + CASE WHEN 1 THEN 1 END
não gera um erro de sintaxe semelhante pelo mesmo motivo. Qualquer expressão que envolvaCASE
a trata como um operador de maior precedência.Fico me perguntando agora por que o código-fonte é expresso assim, apesar de não se comportar assim. Infelizmente, me falta conhecimento de bisão para dar sentido a essa discrepância sem investir mais tempo nessa curiosidade.