2016-08-11 6 views
0

Ich habe ein Skript, wo ich die unten genannten Ausdruck haben.SQL Server - Case Ausdruck und Zahlenformatierung

Die seltsame Sache, die passiert, ist, dass SQL alle Ergebnisse als Dezimal 18,1 ausgibt. Sogar die metricid 1 Datensätze, die als int geworfen werden sollten.

SELECT CASE 

    WHEN metricid = 1 then cast(result as int) 
    WHEN metricid = 2 then cast(result as decimal(18,1) 

    END as column1 
    from sometable 

ich so etwas wie die folgenden als zweite Bedingung auch hinzugefügt, die bewertet werden sollten, nicht, weil 1 nicht = 3 (richtig?), Aber es wandelt noch alle Ergebnisse dezimal:

WHEN 1=3 and metricid = 2 then cast(result as decimal(18,1) 

ich denke, dass ich die SQLs brach .... :(

+4

Sie können nur pro Spalte einen Datentyp haben. 'Spalte1' ist eine einzelne Spalte. – Blorgbeard

+0

Es gibt nichts Seltsames, eine Spalte kann nur einen Datentyp haben – Lamak

+1

Es könnte hilfreich sein, wenn Sie den Unterschied zwischen einer * Anweisung * und einem * Ausdruck * verstanden haben. Was Sie verwenden, ist ein 'CASE' * Ausdruck *. Wie bei jedem Ausdruck gibt es einen Wert (pro Zeile) zurück. –

Antwort

4

SQL erlaubt es nur einen Datentyp in einer einzigen Spalte die mögliche Lösung könnte die Ausgabe zu VARCHAR werden Umwandlung betrachten wir zum Beispiel das folgende Beispiel:..

The return type eines CASE-Ausdrucks ist der höchste Prioritätstyp aus der Menge der Typen in result_expressions und dem optionalen else_result_expression. Vorrang von Datentypen kann überprüft werden here.

SQL-Server 2012 +

SELECT CASE WHEN @metricid = 1 then FORMAT(@result, '#') 
      WHEN @metricid = 2 then FORMAT(@result, '#.0') 
      ELSE '' 
     END Result 
+2

THEN FORMAT (Ergebnis, '#') UND DANN FORMAT (Ergebnis, '#. 0') funktioniert gut in SQL 2012 + und wenig Schreiben von Code – Matt

+1

Danke, ich werde es versuchen! Ich konvertierte die endgültige Ausgabe als varchar, aber nicht jede Instanz der Bedingungen innerhalb des Falles! du bist ein Mann. +1 für die Präzedenz-Information (anstatt nur zu sagen "So funktioniert SQL"). Ich dachte, es hätte etwas mit der Priorität zu tun (warum wählte es einen Datentyp aus dem anderen). –

+0

@Matt - Ich würde gerne 'FORMAT' verwenden. Bitte bedenken Sie, dass Sie meine Antwort bearbeiten und Ihren Code unter der Überschrift "SQL Server 2012" platzieren müssen. Ich habe diese Version noch nicht, also ist es nicht angemessen für mich, deine Antwort zu stehlen :) – techspider