2010-07-26 29 views
10

Ich habe eine Tabelle, wie dies Icheine bestimmte Spalte auf einer anderen Spalte Wert auswählen basierend

ID | Type | Val0 | Val1 
1 | 0 | A | NULL 
2 | 1 | NULL | B 

muß Val0 wählen, wenn der Typ 0, und Val1, wenn der Typ 1, und ValN wenn Typ N ...

Wie kann ich das tun?

+0

Können Sie eine Probe der erwarteten Ausgabe bereitstellen? –

+0

'SELECT ... WO ID = 1 - A' – BrunoLM

+0

Nur ein kurzer Kommentar: Wenn Sie solche Tabellen haben, sollten Sie wirklich ein anderes Schema betrachten. Ihre Datenbank folgt mit hoher Wahrscheinlichkeit nicht dem Entity-Relationship-Modell. – Borealid

Antwort

15
SELECT CASE 
      WHEN Type = 0 THEN Val0 
      WHEN Type = 1 Then Val1 
      . 
      . 
      WHEN Type = N Then ValN 
     END 
    FROM tbl 
+0

Dies hat jedoch anscheinend ein Problem, wenn Sie eine Tabelle aus einer anderen Datenbank verwenden, weil Sql Server dann scheinbar eine maximale Anzahl von Fällen von 10 ... auferlegt, was ziemlich klein ist. – eidylon

3

So wie ich diese Zeilen lesen, müssen Sie UNION verwenden:

SELECT a.val0 
    FROM TABLE a 
WHERE a.type = 0 
UNION ALL 
SELECT a.val1 
    FROM TABLE a 
WHERE a.type = 1 
UNION ALL ... 

UNION ALL nicht entfernt Duplikate und ist schneller als UNION (weil es Duplikate entfernt).

Dies ist dynamisch möglich.

+0

Ich interpretierte es als "gib mir einen einzelnen Wert basierend auf dem gegebenen Typ zurück". Aber du magst vollkommen recht haben. Es war gut, nach einer erwarteten Ausgabe zu fragen :). – dcp

+0

@ dcp: Ich bin zu oft meine falschen Annahmen gebissen worden - ich frage & warte, während ich zusehe, ob es für irgendjemand anderen Sinn ergab –

2

Für niedrige Werte von N, können Sie es tun ad-hoc die CASE statement verwenden, wie CASE Type WHEN 0 THEN Val0 WHEN 1 THEN Val1 END. Wenn Ihr N größer ist, sollten Sie Ihre Datenbank wahrscheinlich normalisieren (d. H. ID => ValN-Mappings in eine andere Tabelle einfügen).

+0

Die CASE-Anweisung funktioniert gut. Der Normalisierungsvorschlag ist gut, aber nicht immer möglich, wenn Sie mit einer anderen Datenbank arbeiten. Unglücklicherweise. – eidylon

Verwandte Themen