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.
Nachdem du deine Erklärung gelesen hast, gibt es einen besseren Weg, dies ohne CASE
zu tun:
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ß.
Bist du sicher, dass du das machen willst? Ihre Fallanweisung gibt IMMER @ContractNo
zurück. Ich denke, wonach Sie suchen:
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.
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.
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 ...
istDie 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.
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).
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önntenWo @contractNo = tblContracts.contractNo
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?!
Tags und Links sql where-clause