A ordem de operação que você coloca LTRIM
e RTRIM
importa quando usada em conjunto com ISNULL
? Por exemplo, veja o exemplo a seguir em que um usuário potencialmente insere vários espaços em um campo, mas cortamos sua entrada para ser um NULL
valor real para evitar o armazenamento de strings vazias.
Estou realizando as TRIM
operações fora de ISNULL
:
DECLARE @Test1 varchar(16) = ' '
IF LTRIM(RTRIM(ISNULL(@Test1,''))) = ''
BEGIN
SET @Test1 = NULL
END
SELECT @Test1
Isso retorna adequadamente um valor verdadeiro NULL
. Agora vamos colocar ISNULL
do lado de fora:
DECLARE @Test2 varchar(16) = ' '
IF ISNULL(LTRIM(RTRIM(@Test2)),'') = ''
BEGIN
SET @Test2 = NULL
END
SELECT @Test2
Isso também retorna um NULL
valor. Ambos funcionam bem para o uso pretendido, mas estou curioso para saber se há alguma diferença em como o otimizador de consulta SQL lida com isso?
Seus testes são redundantes. Primeiro, LTRIM e RTRIM retornam NULL quando recebem entrada NULL:
Segundo, o SQL padrão ignora espaços à direita ao comparar strings:
O SQL Server fornece a função NULLIF . Isso leva dois parâmetros. Se forem diferentes, o primeiro será devolvido. Se forem iguais retornará NULL. Acho que isso vai atender a sua necessidade.
Você ainda pode precisar do LTRIM, dependendo da validação de entrada.
O SQL Server avaliará as funções de dentro para fora. Seu primeiro exemplo é equivalente a:
Como
ISNULL
apenas retorna o primeiro valor não NULL, a função apenas retorna@Test1
. Em seguida, continua a aparar os espaços em branco. Se você inverter a ordem deles, ele agirá exatamente da mesma maneira, porqueISNULL
sempre será avaliado como FALSE.Para o propósito descrito, a ordem é amplamente irrelevante. A
ISNULL
função é necessária apenas para situações em que você não se importa em cortar espaços em branco e vice-versa (comoLTRIM
/RTRIM
não faz nada com valores NULL).