2016-04-14 9 views
1

Ich versuche, eine foreach Anweisung mit einer einzigen SQL-Abfrage zu ersetzen, meinen Code Ich möchte wie folgt aussieht ändern:IF-Anweisung Abfrage Syntaxfehler

this.Settings = new List<Setting>() 
     { 
      // Write all the settings from the VB 
      new Setting() { Name = "NOOFORDERS", Value = null }, 
      new Setting() { Name = "ORDNVGREQ", Value = null }, 
      new Setting() { Name = "IncWendsDel", Value = null }, 
      new Setting() { Name = "AUTOEMAIL_INVOICE", Value = null }, 
      new Setting() { Name = "REQEMAIL_INVOICE", Value = null }, 
      new Setting() { Name = "REQEMAIL_SALES", Value = null }, 
      new Setting() { Name = "REQEMAIL_PICKSLIP", Value = null }, 
      new Setting() { Name = "REQEMAIL_DESPATCH", Value = null }, 
      new Setting() { Name = "CARRPARTSHIP", Value = null }, 
      new Setting() { Name = "DELNOTEREQ", Value = null }, 
      new Setting() { Name = "REQ_CARRPARTSHIP", Value = null }, 
      new Setting() { Name = "BUDGETREQ", Value = null }, 
      new Setting() { Name = "PriceList", Value = null }, 
      new Setting() { Name = "EmployeeRenew", Value = null }, 
      new Setting() { Name = "Warehouse", Value = null }, 
      new Setting() { Name = "EmployeeDetails", Value = null }, 
     }; 
var value = this.db.tblbus_setvalues.Where(x => x.SettingID == setting.Name && x.BusinessCode == this.Business.BusinessCode).FirstOrDefault().Value; 
switch (value.GetType()) 
{ 
    case typeof(bool): 
     (value) ? setting.Value = "true" : setting.Value = "false"; 
     break; 
    default: 
     setting.Value = value.ToString(); 
     break; 
    } 
    if (!string.IsNullOrEmpty(setting.Value)) setting.Value = this.db.tblbus_settings.Where(x => x.SettingID == setting.Name).FirstOrDefault().Default.ToString(); 

My SQL, die ich den obigen Code ersetzen möchten mit das wie folgt aussieht:

SELECT t1.SettingID, t2.Value, t1.Default 
FROM `tblbus_settings` t1 
LEFT JOIN `tblbus_setvalues` t2 
ON t1.SettingID = t2.SettingID 
WHERE `BusinessCode` = "XXX" // Dependency 
AND t1.`BusType` = "CUS" 

Kann mir jemand helfen, eine IF-Anweisung auf diese SQL-Abfrage zu schreiben, die die t2.Value wenn die t1.Default ist null wird nur angezeigt werden?

Ich habe versucht, Dinge wie:

IF(t2.value == NULL) { t1.Default } 
ELSE { t2.Value } 

Aber sie alle geben mir SQL-Syntax-Fehler.

Antwort

3

Sie die coalesce Funktion verwenden können, die den ersten Nicht-NULL-Wert in der Liste zurückgibt, oder NULL, wenn es keine Nicht-NULL-Werte sind:

SELECT t1.SettingID, COALESCE(t2.Value, t1.Default) FROM ... 
+0

Dies ergab 141 Zeilen, wo es 150 Zeilen geben sollte:/Seltsam - Ermittlungszeit aber danke für die Quelle! Ich werde es markieren, wenn ich kann – KDOT

+0

Das ist eine bessere Antwort als die, die ich eingereicht habe, gehen Sie mit :) –

2

So ähnlich?

SELECT t1.SettingID, t2.Value, t1.Default, 
CASE t1.Default IS NOT NULL 
    THEN t1.Default 
    ELSE t2.Value 
FROM `tblbus_settings` t1 
LEFT JOIN `tblbus_setvalues` t2 
ON t1.SettingID = t2.SettingID 
WHERE `BusinessCode` = "XXX" // Dependency 
AND t1.`BusType` = "CUS" 

Sehen Sie diese für Meore https://msdn.microsoft.com/en-gb/library/ms181765.aspx

Verwandte Themen