SQL - CASE-Ausdruck innerhalb von WHERE

7

Ich habe gelesen, dass ich den CASE-Ausdruck in der WHERE-Klausel verwende:

Ссылка

Ich versuche, dies zu verwenden, um die Ergebnisse meiner SELECT-Anweisung zu filtern, basierend auf einer Vertragsnummer, die von der Benutzeranwendung übergeben wird. Mein Code gibt derzeit einen Fehler von "Ungültiger Parameter" aus, egal, was übergeben wird. Ich habe bestätigt, dass SELECT / FROM funktioniert, als wo eine WHERE-Klausel ohne einen CASE-Ausdruck. Hier ist mein Code.

%Vor%

Die Redundanz des Codes dient zur Fehlersuche. Ich plane, die Platzhalter-Filterung später in CASE zu verwenden. Ich konzentriere mich darauf, die Syntax jetzt zu korrigieren. Ich glaube, das sollte alle Datensätze zurückgeben, für die der Parameter mit der in der Tabelle gespeicherten Vertragsnummer übereinstimmt. Jede Hilfe oder Beratung wäre sehr willkommen.

    
casperOne 05.01.2009, 20:39
quelle

12 Antworten

7

Nachdem du deine Erklärung gelesen hast, gibt es einen besseren Weg, dies ohne CASE zu tun:

%Vor%

Dies gibt nur übereinstimmende Vertragsnummern zurück, außer @ContractNo ist 0, in diesem Fall werden alle Datensätze zurückgegeben.

Bearbeiten: Ich habe gerade bemerkt, dass casperOne schlug dasselbe vor . Das habe ich nicht gesehen. Mach dich groß.

    
recursive 05.01.2009, 21:15
quelle
9

Bist du sicher, dass du das machen willst? Ihre Fallanweisung gibt IMMER @ContractNo zurück. Ich denke, wonach Sie suchen:

%Vor%

Der obige Filter sagt "Gib mir den Vertrag, wo% code_% gleich dem Parameter ist, oder alle, wenn der Parameter 0 ist.

Der vorherige Filter hat nur gefiltert, wo das Feld der Vertragsnummer genau dem Parameter entspricht.

Unabhängig davon sollten Sie dies stattdessen tun:

%Vor%

Die Logik ist viel einfacher zu verstehen, und obendrein (zitieren Sie mich nicht dazu), wird der Optimierer wahrscheinlich außerhalb der case-Anweisung besser funktionieren.

    
casperOne 05.01.2009 20:47
quelle
2

Versuchen Sie, die Klammern wegzulassen, die an der falschen Stelle sind - die richtige sollte nach "END" sein.

    
dkretz 05.01.2009 20:44
quelle
2

Vielleicht haben Sie vergessen, @ContractNo zu deklarieren? Ist es vergleichbar mit 0 und tblContracts.ContractNo?

    
Manu 05.01.2009 20:48
quelle
1

Recursives Beitrag hat mein Problem genau gelöst.

Ich sah Beschwerden über die Klarheit meines ursprünglichen Posts. Was kann ich in Zukunft tun, um das, was ich sage, einfacher zu machen? Ich bin es nicht gewohnt, Fragen über Code zu formulieren und entschuldige mich für irgendwelche verwirrten Dinge, die es hatte. Musste ich nur die erweiterten Details wie in meinem zweiten Beitrag bereitstellen?

Nochmals vielen Dank für die Hilfe.

    
Nick 05.01.2009 21:22
quelle
1

Verschieben Sie Ihre enge Klammer vor dem = wie folgt:

%Vor%

Ich verstehe nicht, was diese Case-Anweisung tun wird ... Sie geben dasselbe zurück, wenn @ContractNo = 0 ist oder wenn es nicht ...

ist

Die korrekte Syntax lautet:

%Vor%

Unabhängig von der Syntax ist Ihr Beispiel nicht sehr sinnvoll, wenn Sie nach allen Elementen suchen, die übereinstimmen oder eine Vertragsnummer von 0 haben, dann tun Sie Folgendes:

%Vor%

Was viel sinnvoller zu sein scheint als das, wofür Sie die case-Anweisung verwenden möchten.

Bearbeiten: Ich muss die Frage leicht falsch gelesen haben - der fehlende Parameter bedeutet normalerweise, dass der Parameter (in diesem Fall @ContractNo) nicht im Rahmen Ihrer Abfrage / Prozedur deklariert ist. Aber jemand hat das bereits darauf hingewiesen, also kann ich dafür keinen Kredit in Anspruch nehmen.

    
BenAlabaster 05.01.2009 20:44
quelle
1

Der Grund für die case-Anweisung, einschließlich der ganzen "Wenn es 0 ist, geben Sie den Parameter, und ansonsten, geben Sie einfach den Parameter" war es zu testen, um zu versuchen, um die Syntax richtig zu bekommen. Ursprünglich hatte ich versucht zu sagen: "Wenn es 0 ist, dann gebe '%' ein, um jeden Wert zurückzugeben. Der Code, den ich dort gepostet habe, war, weil ich 'Invalid Parameter' bekam und dachte, dass etwas mit meiner Syntax nicht in Ordnung ist Ich habe es in grundlegende Parameterübereinstimmung wie folgt getrennt,

%Vor%

es gab Datensätze in Ordnung zurück. Lass mich etwas mehr erklären.

Ich ziehe aus einer Reihe verschiedener Tabellen und filtere den Inhalt mit Informationen, die nicht in der select-Anweisung enthalten sind (d. h. tblContracts erhält keine Informationen von Select, sondern wird nur in Where verwendet). Der Benutzer wählt aus einem Kombinationsfeld, das die verschiedenen Vertragsnummern sowie einen Standardwert von "Alle" haben wird.

Ich werde ein Ereignis haben, wenn sich der Index des Kombinationsfelds ändert. Wenn es "All" ist, wird 0 als Parameter übergeben und ich möchte keine Filterung durchführen. Ansonsten möchte ich nur die Information für diese Vertragsnummer (der Grund für Else @ContractNo).

    
Nick 05.01.2009 21:05
quelle
0

Meinst du nicht etwa so?

%Vor%

Dabei ist @ContractNo eine Variable des gleichen Datentyps wie tblContracts.ContractNo

    
Richard L 05.01.2009 20:46
quelle
0

Warum brauchen Sie überhaupt eine Case-Anweisung?

WHen @ContractNo = 0 dann (0 = tblContracts.ContractNo) else @ContractNo dann (@ContractNo = tblContracts.ContractNo)

Das macht keinen Sinn, da Sie das einfach als

schreiben könnten

Wo @contractNo = tblContracts.contractNo

    
Eppz 05.01.2009 20:47
quelle
0

Ist die Vertragsnummer tatsächlich ein numerischer Wert oder handelt es sich um einen String, der immer ein numerischer Wert ist? Überprüfen Sie Ihre Datentypen zwischen der Tabelle und dem Parameter und der CASE-Anweisung (z. B. "= 0" oder "= '0'")

    
Tom H 05.01.2009 21:00
quelle
0

Diese Syntax sollte funktionieren (in Oracle)

%Vor%     
JosephStyons 05.01.2009 21:23
quelle
0

wenn Sie sagen:

  

Ich ziehe aus einer Reihe verschiedener Tabellen und filtere den Inhalt mit Informationen, die nicht in der select-Anweisung enthalten sind (d. h. tblContracts erhält keine Informationen von Select, sondern wird nur in Where verwendet). Der Benutzer wählt aus einem Kombinationsfeld, das die verschiedenen Vertragsnummern sowie einen Standardwert von "Alle" haben wird.

Dann klingt es für mich, dass sollte eine "Wo existiert" -Klausel haben. weil du keine Informationen aus dem Tisch geholt hast?!

    
Richard L 05.01.2009 21:38
quelle

Tags und Links