2016-09-27 2 views
1

In SQL Server 2012 habe ich eine Reihe von Spalten, die als VARCHAR definiert sind. Die Werte sind Schwellenwerte für eine Metrik und können entweder Zahlen oder Zeichenfolgenwerte sein. Zum Beispiel sind die Schwellenwerte für die Temperatur die Nummern 0 und 100, wohingegen Schwellenwerte für die Tür open und closed wären.So vergleichen Sie eine Zeichenfolge als Ganzzahl

Ich möchte einen Wert [ResponseValue] testen, um zu sehen, ob es zwischen zwei definierten Schwellenwerten liegt, [Value_Threshold_min] und [Value_Threshold_max]. Die [ResponseValue] kann entweder NUMERIC oder VARCHAR sein, wird aber immer als VARCHAR gespeichert. Die sind als VARCHAR gespeichert.

SELECT responsevalue 
     , (CASE WHEN ResponseValue BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max else END THEN column_color 
FROM steps 
JOIN responses on responses.stepid = steps.id 
WHERE stepid = 4447 

Dies testet Werte, die numerisch sind, nicht ordnungsgemäß. Zum Beispiel soll 12 zwischen 100 und 200 liegen, da es als String ausgewertet wird.

Ich habe versucht zu überprüfen, ob der Wert numerisch ist und wenn ja, es in int konvertieren, aber das scheitert immer, wenn der Wert alphanumerisch ist.

Wie kann ich eine Zahl als Zahl und Zeichenfolge als Zeichenfolge beim Vergleich behandeln?

+0

, welche Version von SQL 2008, 2012, etc. – scsimon

+0

SQL Server 2012 –

+0

dann definitiv 'TRY_CONVERT verwenden()' anstelle von 'ISNUMERIC'. "ISNUMERIC" kann dazu führen, dass das Ergebnis falsch ist ... d. H., Versuche 'SELECT ISNUMERIC (' 1e4 ')' – scsimon

Antwort

0
SELECT responsevalue, 
    CASE 
     WHEN TRY_CONVERT(INT,ResponseValue) BETWEEN TRY_CONVERT(INT,steps.value_threshold_min) AND TRY_CONVERT(INT,steps.Value_Threshold_max) THEN 'Int Color' 
     WHEN ResponseValue BETWEEN steps.value_threshold_min AND steps.Value_Threshold_max THEN 'VarcharColor' 
     ELSE NULL 
    END as column_color 
FROM steps 
JOIN responses on responses.stepid = steps.id 
WHERE stepid = 4447 
+0

Das funktioniert super! Danke für die Lösung. –

+0

Keine Sorgen @DavidWinslow – scsimon

0

Nun, wenn Sie wissen die Werte gültig Ziffern sind, können Sie sie einfach konvertieren:

SELECT responsevalue, 
     (CASE WHEN r.ResponseValue BETWEEN convert(int, s.value_threshold_min) AND convert(int, s.Value_Threshold_max) 
       ELSE . . . 
     END) column_color 
FROM steps s JOIN 
    responses r 
    on r.stepid = s.id 
WHERE stepid = 4447; 

dies ein Problem verursachen kann, wenn einige Werte Strings sind und einige ints - und das kann sogar treten in Zeilen auf, die von der Abfrage nicht ausgewählt werden. Wenn dies ein Problem ist, dann in SQL Server 2012+ können Sie try_convert() verwenden:

SELECT responsevalue, 
     (CASE WHEN r.ResponseValue BETWEEN try_convert(int, s.value_threshold_min) AND try_convert(int, s.Value_Threshold_max) 
       ELSE . . . 
     END) column_color 
FROM steps s JOIN 
    responses r 
    on r.stepid = s.id 
WHERE stepid = 4447; 
+0

Ich bekomme den gleichen Fehler wie bei iznumeric. Die Konvertierung ist fehlgeschlagen, als der Varchar-Wert 'Yes' in den Datentyp int konvertiert wurde. [SQL-Status = S0001, DB-Fehlercode = 245]. Die Werte in responseValue können Zahlen oder Zeichenfolgen sein. Wenn sie Zahlen sind, muss ich sie als Zahlen behandeln, damit die "Zwischen" -Funktion funktioniert. Ich kann nicht alles wie Zahlen behandeln, weil einige der Werte Strings sind. –

+0

@DavidWinslow. . . Hast du 'try_convert()' dann wie empfohlen benutzt? –

+0

@GordonLinoff Ich denke, es ist in der Spalte responsevalue aber könnte falsch sein – scsimon

Verwandte Themen