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-Key: 282133

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

Printed on: April 26, 2024 at 16:04 o'clock

Member: StefanKittel
StefanKittel Sep 06, 2015 updated at 08:32:46 (UTC)
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
Member: PCFJKG
PCFJKG Sep 06, 2015 at 08:39:17 (UTC)
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.
Member: StefanKittel
StefanKittel Sep 06, 2015 at 08:43:30 (UTC)
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
Member: PCFJKG
PCFJKG Sep 06, 2015 updated at 08:52:49 (UTC)
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
Member: Biber
Solution Biber Sep 06, 2015 updated at 13:58:12 (UTC)
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
Member: PCFJKG
PCFJKG Sep 06, 2015 at 13:57:46 (UTC)
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
Member: MadMax
MadMax Sep 07, 2015, updated at Sep 11, 2015 at 10:08:48 (UTC)
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
Member: PCFJKG
PCFJKG Sep 07, 2015 at 12:32:29 (UTC)
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
Member: PCFJKG
PCFJKG Sep 11, 2015 at 00:51:39 (UTC)
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
Member: MadMax
Solution MadMax Sep 11, 2015 updated at 13:15:57 (UTC)
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
Member: PCFJKG
PCFJKG Sep 11, 2015 at 13:15:59 (UTC)
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