Os documentos insistem que ISNULL
é uma função, mas COALESCE
não é. Especificamente, eles dizem
A função ISNULL e a expressão COALESCE
Se eu colocar meu chapéu Lisp, posso pensar nisso COALESCE
como uma macro e tudo faz sentido. No entanto, nunca precisei de tal pensamento no T-SQL. Então, devo perguntar. Em T-SQL:
- Qual é a definição de uma função?
- Qual é a definição de uma expressão?
- Como posso saber a diferença entre uma função e uma expressão?
Geralmente é um erro procurar consistência no SQL Server, mesmo (ou especialmente) na documentação.
Você deve lembrar que o SQL Server é um produto maduro que foi desenvolvido (e documentado) por muitas pessoas e equipes diferentes ao longo dos anos. É natural procurar definições e padronizações, mas nem sempre esse é um objetivo alcançável.
Na medida em que realmente importa, pode-se definir uma função como uma entidade única que recebe um número variável de parâmetros (incluindo nenhum) e retorna um valor (escalar ou retorno de conjunto).
Pode-se definir uma expressão como qualquer sequência de símbolos e operadores que o T-SQL pode avaliar para produzir um resultado. Uma função seria um subconjunto adequado de todas as expressões nesse caso. Não sei o quão útil isso é para alguém em termos práticos.
Também se pode definir uma função do SQL Server como algo documentado para ser função e qualquer outra coisa como uma expressão. Não é muito satisfatório intelectualmente.
Também se pode argumentar que
COALESCE
não é uma função * porque não existe uma função incorporada com esse nome (ela se expande para umaCASE
expressão), o que é um pouco circular.Então, novamente, a documentação refere-se a
CHOOSE
eIIF
como funções lógicas , mas também se expande paraCASE
expressões. Curiosamente, a função interna que implementaCASE
éScaOp_IIF
assim 🤷♂️.Você pode encontrar inúmeras dessas inconsistências. Nesse sentido, não existem respostas simples (mas abrangentes) às suas perguntas.
Você pode perguntar por que a documentação do SQL Server abre uma exceção para
COALESCE
. Minha sensação é que isso foi feito para enfatizar a expansão deCOALESCE
, o que pode levar a resultados inesperados devido a múltiplas avaliações:O acima
COALESCE
se expande para:* Se isso faz você se sentir melhor, o Oracle e o PostgreSQL chamam
COALESCE
uma função.