pcfjkg
Goto Top

MSSQL: Where durch Variable ändern

Ich versuche in Abhängigkeit von einer @variablen eine Abfragebedingung zu ändern:

SELECT COUNT(*) FROM [SQL-Tabelle] WHERE IIF (@Variable IS NULL, [Tabellenspalte] IS NULL, [Tabellenspalte] = @variable)
Ergebnis: Falsche Syntax in der Nähe des IS-Schlüsselworts.

SELECT COUNT(*) FROM [SQL-Tabelle] WHERE CASE @variable when is null then [Tabellenspalte] IS NULL else [Tabellenspalte] = @variable END
Erbegnis: Falsche Syntax in der Nähe des case-Schlüsselworts.

Versuche mit HAVING scheitern ebenfalls an der Syntax.

Frage, ist eine Änderung der WHERE-Bedingung auf diesem Weg überhaupt möglich ?

Danke für jede Antwort im Voraus

PCFJKG

Content-ID: 282133

Url: https://administrator.de/contentid/282133

Ausgedruckt am: 24.11.2024 um 04:11 Uhr

StefanKittel
StefanKittel 06.09.2015 aktualisiert um 10:32:46 Uhr
Goto Top
Moin,

Du must Case verwenden. If geht soweit ich weiß nicht.

WHERE OrderNumber LIKE
CASE WHEN IsNumeric(@OrderNumber) = 1 THEN
@ordernumber
ELSE
'%' + @ordernumber
END

Du hast nicht geschrieben von wo der Aufruf erfolgt.
Häufig ist es viel einfacher in dem System davor den Aufruf zu ändern oder auszuwähen. Z.B. in PHP oder ähnliches.

Viele Grüße

Stefan
PCFJKG
PCFJKG 06.09.2015 um 10:39:17 Uhr
Goto Top
Hallo StefanKittel,

das ist ja nun mal wirklich eine schnelle Antwort und sorry: es geht um den MS-SQL-Server 2012, der Aufruf erfolgt in einer gespeicherten Prozedur. Ich habe Deine Lösung noch nicht verstanden, wollte mich aber jetzt für die wirklich schnelle Antwort bedanken. Grüße von PCFJKG.
StefanKittel
StefanKittel 06.09.2015 um 10:43:30 Uhr
Goto Top
Moin,

google mal nach "sql if in where". Da gibt es viele Beispiele.
Das Problem ist halt, dass man if nicht verwenden kann.

Viele Grüße

Stefan
PCFJKG
PCFJKG 06.09.2015 aktualisiert um 10:52:49 Uhr
Goto Top
Hallo Stefan, es ist sicher undeutlich zu lesen, ich wollte nicht die Ablaufsteuerung IF verwenden, sondern IIF als Kurzform von Case. Viele Grüße von PCFJKG
Biber
Lösung Biber 06.09.2015 aktualisiert um 15:58:12 Uhr
Goto Top
Moin PCFJKG,

es geht sicherlich auch mit einem IIF/CASE WHEN-Konstrukt.
Aber reicht hier nicht ein simples OR?

SELECT COUNT(*) FROM [SQL-Tabelle] 
WHERE  ( ( @Variable IS NULL AND [Tabellenspalte] IS NULL) OR  [Tabellenspalte] = Variable)

Grüße
Biber
PCFJKG
PCFJKG 06.09.2015 um 15:57:46 Uhr
Goto Top
Hallo Biber,

so hatte ich es auch zunächst gelöst, aber einen falschen Count erhalten. Dachte es liegt an diesem >>OR<< (war mir irgendwann zu einfach), aber das WHERE hat 8 weitere Bedingungen und vermutlich muss ich dort weiter suchen. Danke für Deine Antwort, Sie dürfte meine Frage lösen, denn damit bringst Du mich wieder "in die Spur". Aber ein Beispiel für WHERE-Modifizierung mit IIF/CASE WHEN würde mich trotzdem gelegentlich interessieren. Das aber nur nebenbei, jetzt muss ich zunächst den Fehler anderweitig suchen. Also nochmals Danke und einen schönen Rest vom Sonntag.

Grüße von PCFJKG
MadMax
MadMax 07.09.2015, aktualisiert am 11.09.2015 um 12:08:48 Uhr
Goto Top
Hallo PCFJKG,

grundsätzlich würde das, was Du suchst, so funktionieren:
SELECT COUNT(*) FROM [SQL-Tabelle] WHERE [Tabellenspalte] = CASE when @Variable is null then <Wert1> else @Variable END

Oder ab SQL Server 2012 kann wohl auch IIF eingesetzt werden, dann wäre es:
SELECT COUNT(*) FROM [SQL-Tabelle] WHERE [Tabellenspalte] = iif (@Variable is null, <Wert1>, @Variable)

Aber an dieser Stelle ist das Problem, daß <Wert1> dann NULL wäre und somit der Vergleich mit dem Operator "=" fehlerhaft ist. Allerdings würde ich Deine Abfrage wahrscheinlich mit:
SELECT COUNT(*) FROM [SQL-Tabelle] WHERE IsNull ([Tabellenspalte], <x>) = IsNull (@Variable, <x>)
lösen, wobei <x> ein Wert sein müßte, der nicht auftreten kann, sonst könnte das das Ergebnis auch wieder verfälschen.

Gruß, Mad Max
PCFJKG
PCFJKG 07.09.2015 um 14:32:29 Uhr
Goto Top
Hallo MadMax,

prima Ansatz, genau das >IS NULL< ist mein Problem bzw. meine Frage. Auf die Lösung mit <x> IsNULL bin ich nicht gekommen, sieht aber gut aus. Danke für Deine Antwort, ich kann Dir noch keinen Erfolg melden, weil noch nicht ausprobiert. Wie gesagt, sieht aber logisch aus und wird wohl in Ordnung gehen.
Grüße und noch einen schönen Tag, PCFJKG
PCFJKG
PCFJKG 11.09.2015 um 02:51:39 Uhr
Goto Top
Hallo MadMax,
sorry, ... <x> = IsNull ... will TSQL nicht: --> Falsche Syntax in der Nähe des IS-Schlüsselworts. Vermutlich muss ich doch IIF oder Case bemühen.

Gruß PCFJKG
MadMax
Lösung MadMax 11.09.2015 aktualisiert um 15:15:57 Uhr
Goto Top
Moin,

ein Nachtarbeiter, sehr sympathisch face-smile

Auch sorry, da ist mir die schließende Klammer vom IsNull hinter dem <x> abhanden gekommen, also ... <x>) = IsNull ... Dann sollte es auch funktionieren.

Gruß, Mad Max
PCFJKG
PCFJKG 11.09.2015 um 15:15:59 Uhr
Goto Top
Hallo Mad Max,

... "die Nacht ist nicht allein zum Schlafen da" ... Danke und die gute Nachricht, es funktioniert. Vielen Dank und Grüße von PCFJKG