2011-08-30 5 views
12

mam kolumna obliczana, że ​​muszę być polem bit, tu przykład o wzorze:W jaki sposób można wymusić typ danych w kolumnie obliczeniowej na pole bitowe, które nie pozwala na wartości null?

case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end 

Typ danych obliczonego zestawu kolumn przy użyciu tej formuły jest int.

Jaki jest najlepszy sposób wymuszenia prawidłowego typu danych?

Z CONVERT oświadczenia o całej sprawie, typ danych jest bit ale Allow Nulls

CONVERT([bit], 
     case when (([some_field] < [Some_Other_field]) 
     then 0 
     else 1 
     end, 
     0) 

samo z CONVERT oświadczenie w sprawie wyrażenia rezultatu, typ danych jest bit ale Allow Nulls

case when (([some_field] < [Some_Other_field]) 
then CONVERT([bit], (0), 0) 
else CONVERT([bit], (1), 0) 
end 

Czy jest na to mądrzejszy sposób?

Odpowiedz

21

Zawiń obliczoną definicję kolumny w ISNULL, z czymkolwiek, co lubisz, jako drugim argumentem (pod warunkiem, że jest trochę lub można go przekształcić).

Jest to jedno z niewielu miejsc, w których należy używać ISNULL, a nie (ogólnie lepiej zaprojektowanego) COALESCE. SQL Server ma specjalną logikę przypadku, aby zdać sobie sprawę, że ISNULL z nie-pustym drugim argumentem reprezentuje wynik nie-nullable.

Np .:

ISNULL(CONVERT(bit,case when ([some_field] < [Some_Other_field]) 
then 0 
else 1 
end),0) 

ten może być również używany w, na przykład przeglądaj definicje.

+0

Czy ty lub ktoś ma pomysł, czy istnieją różnice w wynikach pomiędzy swoim przykładem i następujące alternatywy składnia: 'przypadek kiedy ([some_field] <[Some_Other_field]) następnie ISNULL (CONVERT (bit 0) , 0) inaczej ISNULL (CONVERT (bit, 1), 1) end'? – tomosius

+0

@tomosius - Nie spodziewałbym się * wymiernej * różnicy w wielkim schemacie rzeczy (np. Koszty I/O związane z dostępem do danych i obciążeniami sieciowymi). Podejrzewam też, że twój wariant może ponownie wprowadzić problem, którego nie dotyczyło, i że niektóre wyrażenia "CASE" są często analizowane jako potencjalnie nie do zniesienia, mimo że przez inspekcję wiemy, że nie mogą tego zrobić. –