Eu entendo que perguntas semelhantes a essas aparecem frequentemente por aqui. Pesquisei antes de postar isso, mas não encontrei nenhum tópico de controle de qualidade que responda completamente às minhas perguntas. Em uma tabela, basicamente tenho que tratar NULL
s, strings vazias e espaços em branco (puros) como 'vazios' e contar o número de células não em branco. A tabela contém uma combinação de numeric
e bit
colunas nvarchar
.
Q1 Na tabela TABLE1
, tenho uma coluna COLUMN1 nvarchar(32)
com a seguinte distribuição de dados:
Value RowCount
N/A 80 -- string 'N/A'
NULL 20 -- actual nulls
Por que a última das consultas a seguir retorna resultados inesperados?
SELECT SUM(CASE WHEN COLUMN1 IS NOT NULL THEN 1 ELSE 0 END)
FROM TABLE1 -- returns 80, as expected
SELECT SUM(CASE WHEN COLUMN1 NOT IN (NULL, '') THEN 1 ELSE 0 END)
FROM TABLE1 -- returns 80, as expected
SELECT SUM(CASE WHEN COLUMN1 NOT IN ('') THEN 1 ELSE 0 END)
FROM TABLE1 -- returns 80, but I expected 100.
Q2 Eu tenho outra coluna COLUMN2 numeric(18, 0)
preenchida com valores sem NULL
s ou strings vazias (mas pode conter um/ambos). Mas a segunda das consultas abaixo falha devido a um motivo que não entendo.
SELECT SUM(CASE WHEN COLUMN2 NOT IN ('', NULL) THEN 1 ELSE 0 END)
FROM TABLE1 -- returns full rowcount (100), as expected.
SELECT SUM(CASE WHEN COLUMN2 NOT IN (NULL, '') THEN 1 ELSE 0 END)
FROM TABLE1 --query FAILS! (Msg 8114, Level 16, State 5, Line 1. Error converting data type varchar to numeric.)
Q3 O que é uma expressão abrangente para meu requisito de verificar uma coluna para NULLs, strings vazias e espaço em branco puro, independentemente do tipo de dados de uma coluna? Se meu nome de coluna vier de uma variável (cursorizada) @column
, o que devo colocá-lo e compará-lo? Eu tentei trabalhar com cast
to nvarchar
e usar LTRIM
/ RTRIM
, mas francamente estou um pouco perdido neste momento.
Estou usando o SQL Server 2008. Obrigado por ler isso e por sua ajuda.