Ich arbeite mit einer Abfrage, die die Anweisung "CASE" in der Klausel "WHERE" enthält. SQL Server 2008 gibt jedoch einige Fehler bei der Ausführung aus. Kann mir bitte jemand bei der richtigen Abfrage helfen? Hier ist die Abfrage:
SELECT
tl.storenum 'Store #',
co.ccnum 'FuelFirst Card #',
co.dtentered 'Date Entered',
CASE st.reasonid
WHEN 1 THEN 'Active'
WHEN 2 THEN 'Not Active'
WHEN 0 THEN st.ccstatustypename
ELSE 'Unknown'
END 'Status',
CASE st.ccstatustypename
WHEN 'Active' THEN ' '
WHEN 'Not Active' THEN ' '
ELSE st.ccstatustypename
END 'Reason',
UPPER(REPLACE(REPLACE(co.personentered,'RT\\\\',''),'RACETRAC\\\\','')) 'Person Entered',
co.comments 'Comments or Notes'
FROM
comments co
INNER JOIN cards cc ON co.ccnum=cc.ccnum
INNER JOIN customerinfo ci ON cc.customerinfoid=ci.customerinfoid
INNER JOIN ccstatustype st ON st.ccstatustypeid=cc.ccstatustypeid
INNER JOIN customerstatus cs ON cs.customerstatuscd=ci.customerstatuscd
INNER JOIN transactionlog tl ON tl.transactionlogid=co.transactionlogid
LEFT JOIN stores s ON s.StoreNum = tl.StoreNum
WHERE
CASE LEN('TestPerson')
WHEN 0 THEN co.personentered = co.personentered
ELSE co.personentered LIKE '%TestPerson'
END
AND cc.ccnum = CASE LEN('TestFFNum')
WHEN 0 THEN cc.ccnum
ELSE 'TestFFNum'
END
AND CASE LEN('2011-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered = co.DTEntered
ELSE
CASE LEN('2012-01-09 11:56:29.327')
WHEN 0 THEN co.DTEntered >= '2011-01-09 11:56:29.327'
ELSE co.DTEntered BETWEEN '2011-01-09 11:56:29.327' AND '2012-01-09 11:56:29.327'
END
END
AND tl.storenum < 699
ORDER BY tl.StoreNum
sql
sql-server
case
user1018213
quelle
quelle
Antworten:
Zunächst muss die
CASE
Anweisung Teil des Ausdrucks sein, nicht der Ausdruck selbst.Mit anderen Worten, Sie können haben:
Aber es wird nicht so funktionieren, wie Sie sie geschrieben haben, zB:
Mit kombinierten ODER-Anweisungen wie diesen haben Sie möglicherweise mehr Glück:
In beiden Fällen bin ich mir nicht sicher, wie gut ein Abfrageplan ist. Diese Arten von Spielereien in einer
WHERE
Klausel verhindern häufig, dass das Abfrageoptimierungsprogramm Indizes verwendet.quelle
co.personentered
ist, ist in Option 1 und 2 nicht null. Jetzt reicht die dritte Option aus. Aber das will ich wissen ... !!where case c when 1 then (DescriptionCode is null) else descriptioncode is not null end
, aber ich zeige den Fehler wieIncorrect syntax near the keyword 'is'.
Dies sollte Ihr Problem vorerst lösen, aber ich muss Sie daran erinnern, dass es kein guter Ansatz ist:
quelle
Versuche Folgendes:
quelle
Ich denke, dass der Anfang Ihrer Anfrage so aussehen sollte:
ABER
Was im Schwanz ist, ist völlig unverständlich
quelle
Dieser
WHERE
Teil könnte so geschrieben werden:quelle
Sie können es auch wie unten versuchen, z. um nur ausgehende Sendungen anzuzeigen
quelle
Vielen Dank für diese Frage, eigentlich suche ich etwas anderes, das in der folgenden Abfrage steht. das kann jemandem helfen.
Die obige Abfrage dient zum Ausfüllen der Dropdown-Liste, deren leere Werte als "(leer)" angezeigt werden. Auch wenn wir diesen Wert an die SQL where-Klausel übergeben, um leere Werte mit anderen Werten zu erhalten, weiß ich nicht, wie ich damit umgehen soll. Und schließlich kam mit der folgenden Lösung, die jemandem helfen kann.
hier ist es ,
quelle
Hier ist meine Lösung
Regads Davy
quelle
Das funktioniert
quelle
quelle
Auf diese Weise verwenden.
quelle