2017-09-12 3 views
0

Ich habe diese folgende SQL-AbfrageUmgestalten mit COALESCE, ISNULL oder CASE WHEN

GO 
SELECT @StartDate= table1.StartDate, @EndDate= table2.EndDate from table1 join table2 

SELECT @StartDate= table2.StartDate, @EndDate= table3.EndDate from table2 join table3 

SELECT @StartDate= table3.StartDate, @EndDate= table4.EndDate from table3 join table4 

Grundsätzlich, wenn die letzte Abfrage nicht null ist dann das wäre der endgültige Wert der @StartDate und @EndDate sein. Was ist der beste Ansatz zu diesem Thema ist, ich denke an mit ISNULL, COALESCE oder CASEWHEN

Antwort

2

Ich denke, es gibt keine Notwendigkeit für 3 Abfragen ist das gewünschte Ergebnis zu erhalten. ISNULL Funktion wird nur einmal ausgewertet. COALESCE Ausdruck kann mehrfach ausgewertet werden.

SELECT @StartDate = COALESCE(table3.StartDate, table2.StartDate, table1.StartDate) 
     ,@EndDate = COALESCE(table4.EndDate, table3.EndDate, table2.EndDate) 
    FROM table1 
    LEFT JOIN table2 
    LEFT JOIN table3 
    LEFT JOIN table4 
+0

Ich bin ein wenig unklar, auf welcher OP bedeutet durch „die letzte Abfrage nicht null ist“. Würde es in diesem Fall in Tabelle 4 einen Eintrag geben? Wenn nicht, würde ich vorschlagen, diese Lösung zu ändern, um LEFT JOIN anstelle von INNER JOIN zu verwenden. – Brett

+0

Ja, Sie haben Recht. Die Antwort wurde geändert. –

0
DECLARE @DataSource TABLE 
(
    [RecordID] TINYINT PRIMARY KEY 
); 

DECLARE @DataSourceDates01 TABLE 
(
    [RecordID] TINYINT PRIMARY KEY 
    ,[StartDate] DATETIME2 
    ,[EndDate] DATETIME2 
); 

DECLARE @DataSourceDates02 TABLE 
(
    [RecordID] TINYINT PRIMARY KEY 
    ,[StartDate] DATETIME2 
    ,[EndDate] DATETIME2 
); 


DECLARE @DataSourceDates03 TABLE 
(
    [RecordID] TINYINT PRIMARY KEY 
    ,[StartDate] DATETIME2 
    ,[EndDate] DATETIME2 
); 

INSERT INTO @DataSource ([RecordID]) 
VALUES (1), (2), (3); 

INSERT INTO @DataSourceDates01 ([RecordID], [StartDate], [EndDate]) 
VALUES (1, GETUTCDATE(), GETUTCDATE()); 

INSERT INTO @DataSourceDates02 ([RecordID], [StartDate], [EndDate]) 
VALUES (1, GETUTCDATE(), GETUTCDATE()) 
     ,(2, GETUTCDATE(), GETUTCDATE()); 

INSERT INTO @DataSourceDates03 ([RecordID], [StartDate], [EndDate]) 
VALUES (1, GETUTCDATE(), GETUTCDATE()) 
     ,(2, GETUTCDATE(), GETUTCDATE()) 
     ,(3, GETUTCDATE(), GETUTCDATE()); 

SELECT DS.[RecordID] 
     ,COALESCE(DS1.[StartDate], DS2.[StartDate], DS3.[StartDate]) AS [StartDate] 
     ,COALESCE(DS1.[EndDate], DS2.[EndDate], DS3.[EndDate]) AS [EndDate] 
FROM @DataSource DS 
LEFT JOIN @DataSourceDates01 DS1 
    ON DS.[RecordID] = DS1.[RecordID] 
LEFT JOIN @DataSourceDates02 DS2 
    ON DS.[RecordID] = DS2.[RecordID] 
LEFT JOIN @DataSourceDates03 DS3 
    ON DS.[RecordID] = DS3.[RecordID];