2012-03-30 20 views
0
SELECT * 
FROM T1 INNER JOIN T2 ON T1.C1 = T2.C1 
WHERE 
((T1.C3-T2.C3<>0) 
And (CASE WHEN T1.C4 <> T2.C4 THEN 'Changed' END)) 
OR 
((T1.C5-T2.C5<>0) 
And (T1.C6-T2.C6<>0)) 

Das ist mir einen Fehler geben ->SQL Server 2005 und Oder

Ein Ausdruck von Nicht-Typ boolean in einem Kontext angegeben, wo eine Bedingung zu erwarten ist, in der Nähe von ')'.

Was ist falsch an dieser Aussage ?? Diese

+0

Lösung ist -> SELECT * FROM T1 INNER JOIN T2 T1.C1 ON = T2.C1 WHERE ((T1 .C3-T2.C3 <> 0) Und (FALL WENN T1.C4 <> T2.C4 DANN 1 ENDE) = 1) ODER ((T1.C5-T2.C5 <> 0) Und (T1 .C6-T2.C6 <> 0)) –

Antwort

0

Wenn Sie Ihre Case-Anweisung in der Was-Klausel betrachten, wird die Case-Anweisung nicht mit einem Wert verglichen.

Ich würde vorschlagen, Ihre case-Anweisung in die select-Anweisung zu verschieben oder sicherzustellen, dass Sie einen Wert haben, mit dem die case-Anweisung verglichen werden kann.

dh:

declare @Changed nvarchar(50) = 'Changed' 

in der WHERE-Klausel:

@Changed = (CASE WHEN T1.C4 <> T2.C4 THEN 'Changed' END)) 
+0

In meiner Select-Anweisung speichere ich diesen CASE-Vergleich in einer anderen Spalte .. die Anweisung ist SELECT T1. *, CASE WANN T1.C4 <> T2.C4 DANN 'Geändert' END AS C10 FROM T1 .. WHERE Bedingung .. Motiv ist -> ich muss diesen Vergleich machen und speichern Sie den Vergleich als "Geändert" –

+0

habe es. schreibe als UND (FALL WENN T1.C4 <> T2.C4 DANN 1 ENDE) = 1 Ich denke, das sollte es lösen. –

+0

@rahul shukla das ist in der Tat, was ich mit dir meinte, muss es gegen etwas vergleichen. – Lex

4

ist wahrscheinlich die Ursache:

And (CASE WHEN T1.C4 <> T2.C4 THEN 'Changed' END)) 

Sie machen eine AND auf etwas, das Changed zurückgeben kann, was nicht ein boolescher Wert ist.

+0

das ist dumm !! Ich habe es blind von Select-Anweisung in meiner Abfrage kopiert .. Danke !! –