2017-08-22 13 views
2

zu vergleichen, bekam ich einen Fehler, wenn ich versuche, unter Abfrage auszuführen. kann jemand aussortieren das würde geschätzt.Fehler beim Konvertieren des Datentyps varchar in numerisch. Wenn ich versuche, numerische

DECLARE @TABLE TABLE(ID INT,CATEGORY VARCHAR(30),VALUE VARCHAR(30)) 
INSERT INTO @TABLE 
SELECT 1,'A','5' 
UNION ALL 
SELECT 2,'B','6' 
UNION ALL 
SELECT 3,'C','VAL' 
UNION ALL 
SELECT 4,'D','HSD' 

DECLARE @TABLE1 TABLE(ID INT,CATEGORY VARCHAR(30),VALUE VARCHAR(30)) 
INSERT INTO @TABLE1 
SELECT 1,'A','5.0' 
UNION ALL 
SELECT 2,'B','6.0' 
UNION ALL 
SELECT 3,'C','VAL' 
UNION ALL 
SELECT 4,'D','HSD' 

SELECT 
    A.ID, 
    A.CATEGORY, 
    A.VALUE 
FROM @TABLE A, @TABLE1 B 
WHERE 
    CASE ISNUMERIC(A.VALUE) WHEN 1 THEN CAST (A.VALUE AS NUMERIC) 
            ELSE A.VALUE END=CASE ISNUMERIC(B.VALUE) WHEN 1 
            THEN CAST (B.VALUE AS NUMERIC) ELSE B.VALUE END 

Antwort

3

Ich glaube, der Fehler, den Sie bekommen von verursacht wird, dass Ihre CASE Ausdrücke in der WHERE Klausel Zweige mit verschiedenen Arten, nämlich Text und numerisch. Um dies zu beheben, müssen Sie alle Zweige vom selben Typ machen. Wenn man alles numerisch macht, funktioniert das wegen des Textes nicht, aber wir können stattdessen alles Text machen.

Für den Fall von numerischen Daten haben Sie nicht einmal die gleiche Art von Daten dort. Um dies zu umgehen, können Sie die numerischen Daten zu einem gemeinsamen Dezimalformat werfen, bevor wieder zu Text konvertieren:

WHERE 
    CASE WHEN ISNUMERIC(A.VALUE) = 1 
     THEN CONVERT(VARCHAR, CAST(A.VALUE AS DECIMAL(10,2))) 
     ELSE A.VALUE END = 
    CASE WHEN ISNUMERIC(B.VALUE) = 1 
     THEN CONVERT(VARCHAR, CAST(B.VALUE AS DECIMAL(10,2))) 
     ELSE B.VALUE END 

Die beste langfristige Lösung für Sie wäre nicht Text und numerische Daten in der gleichen Spalte mischt . Ich weiß nicht, warum diese Antwort abgelehnt wurde, da es ein funktionierender Code ist, der die ursprüngliche Frage beantwortet.

Ausgang:

enter image description here

Demo hier:

Rextester

-2

One Spalten können nur eine Art sein ..

Sie können nicht zwei setzen Geben Sie "NUMERIC" ein und "varchar (30)" in einer Spalte ...

Der beste Weg wird in einen Typ umgewandelt. Scheint, dass varchar (30) eine bessere Wahl ist.

SELECT 
    A.ID, 
    A.CATEGORY, 
    A.VALUE 
FROM @TABLE A, @TABLE1 B 
WHERE 
    ISNUMERIC(A.VALUE) = ISNUMERIC(B.VALUE) 
    and 
    CASE ISNUMERIC(A.VALUE) WHEN 1 THEN CAST(CAST(A.VALUE AS NUMERIC) as VARCHAR(30)) ELSE A.VALUE END 
    = CASE ISNUMERIC(B.VALUE) WHEN 1 THEN cast(CAST(B.VALUE AS NUMERIC) as VARCHAR(30)) ELSE B.VALUE END 
+1

Ich glaube nicht, dass dies das ist, was das OP will, weil keine der numerischen Daten übereinstimmt: [Siehe hier] (http://rextester.com/NAI20018). –

+0

@TimBiegeleisen Ich habe die Frage falsch gelesen ... –

Verwandte Themen