La coalesce() è la soluzione migliore quando ci sono più colonne [e]/[o] v alues e tu vuoi il primo. Tuttavia, guardando i libri on-line, la query ottimizza la converte in un'istruzione case.
MSDN estratto
L'espressione COALESCE è una scorciatoia sintattica per l'espressione CASE.
Cioè, il codice COALESCE (espressione1, ... n) viene riscritto da Query Optimizer come la seguente espressione CASE:
CASE
WHEN (expression1 IS NOT NULL) THEN expression1
WHEN (expression2 IS NOT NULL) THEN expression2
...
ELSE expressionN
END
Detto questo, perché non un semplice ISNULL()? Meno codice = soluzione migliore?
Ecco uno snippet di codice completo.
-- drop the test table
drop table #temp1
go
-- create test table
create table #temp1
(
issue varchar(100) NOT NULL,
total_amount int NULL
);
go
-- create test data
insert into #temp1 values
('No nulls here', 12),
('I am a null', NULL);
go
-- isnull works fine
select
isnull(total_amount, 0) as total_amount
from #temp1
Ultimo ma non meno importante, come vanno le cose valori nulli in una colonna NOT NULL?
Ho dovuto modificare la definizione della tabella in modo da poter impostare il test case. Quando provo ad alterare la tabella con NOT NULL, fallisce poiché esegue un controllo di nullability.
-- this alter fails
alter table #temp1 alter column total_amount int NOT NULL
fonte
2013-10-01 12:30:02
Puoi pubblicare l'intera query? Anche se sembra essere ok, sia la tua dichiarazione sulla tabella sia ciò che selezioni. –
dovrebbe essere lasciato il problema di Join, per favore pubblica la tua domanda – vikas