Frage

Ich habe gelesen über die Verwendung der CASE-Ausdruck in der WHERE-Klausel hier:

http://scottelkin.com/sql/using-a-case-statement-in-a-sql-where-clause/

Ich versuche, verwenden Sie diese zum filtern von Ergebnissen aus meiner select-Anweisung, basierend auf einer Vertragsnummer, die übergeben werden durch die Anwendung des Benutzers ist.Mein code derzeit wirft einen Fehler "Ungültiger parameter" egal, was übergeben wird.Ich überprüft WÄHLEN Sie/AUS funktionieren, als, wo, wie Sie eine WHERE-Klausel ohne ein CASE-Ausdruck.Hier ist mein code.

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END =
tblContracts.ContractNo)

Die Redundanz des Codes ist für die Problembehandlung, ich bin der Planung auf die Verwendung von wildcard-Filterung auf den FALL später.Ich konzentriere mich darauf, die syntax unten rechts jetzt.Ich glaube, das sollten alle Datensätze zurück, für die der parameter entspricht der Vertragsnummer in der Tabelle gespeichert.Jede Hilfe oder Beratung wäre sehr geschätzt.

War es hilfreich?

Lösung

Nach der Lektüre Ihrer Erklärung, es ist ein besserer Weg, dies zu tun, ohne CASE:

WHERE @ContractNo = 0 OR tblContracts.ContractNo = @ContractNo

Dies wird nur Rückgabe passenden Vertrag zahlen, es sei denn, @ContractNo 0, in welchem Fall es werden alle Datensätze zurück.

Edit: Ich habe gerade bemerkt, dass casperOne vorgeschlagen, die gleiche Sache.Ich habe nicht sehen, dass.Big up yourself.

Andere Tipps

Sind Sie sicher, dass Sie dies tun wollen? Ihr Fall Anweisung gibt immer @ContractNo. Ich denke, was Sie suchen, ist dies:

where 
    case @ContractNo 
        when 0 then tblContracts.ContractNo 
        else @ContractNo 
    end = tblContracts.ContractNo

Der Filter oben sagt: „Gib mir den Auftrag, wo die ContractNo die Parameter gleich, oder alle von ihnen, wenn der Parameter 0 ist.

Der bisherige Filter nur gefiltert, wenn der Vertrag Nummernfeld auf den Parameter genau gleich ist.

Egal, sollten Sie dies tun, anstatt:

where @ContractNo = 0 or @ContractNo = tblContracts.ContractNo

Die Logik ist viel einfacher zu verstehen, und obendrein (zitieren Sie mich nicht auf diesem), der Optimierer wahrscheinlich besser außerhalb der Case-Anweisung funktioniert.

Versuchen Sie, die Klammern auslassen, die ohnehin an der falschen Stelle sind -. Das richtige nach „END“ sein sollte

Vielleicht haben Sie vergessen @ContractNo zu erklären? Ist es vergleichbar mit 0 und tblContracts.ContractNo?

Recursive der Post löste mein Problem genau.

Ich habe Beschwerden über die Klarheit meiner ursprünglichen Post. In der Zukunft, was kann ich tun, um zu machen, was mehr geradeaus ich sage? Ich bin nicht zu formulieren Fragen zu Code, und entschuldigen uns für etwaige verworrenen Dinge, die es hatte verwendet. Habe ich nur die erweiterten Details wie in meinem zweiten Beitrag liefern müssen?

Nochmals vielen Dank für die Hilfe.

Bewegen Sie die schließende Klammer zu, bevor die = etwa so:

WHERE     (CASE WHEN @ContractNo = 0 THEN @ContractNo ELSE @ContractNo END)=tblContracts.ContractNo

Ich verstehe nicht, was dieser Fall Aussage obwohl tun ... du bist die gleiche Sache im Falle der Rückkehr der @ContractNo = 0 oder wenn es nicht ...

Die korrekte Syntax lautet:

  Select...
  ...
  Where(
    Case
      When <Condition>
        Then <Return if true>
        Else <Return if false>
      End
 ) = <Whatever is being matched to the output of the case statement>

Unabhängig von der Syntax aber Ihr Beispiel nicht viel Sinn machen, wenn Sie für alle Artikel suchen, die eine Vertragsnummer von 0 entsprechen oder haben, dann würden Sie tun:

Select...
...
Where (
  @ContractNo = 0 Or
  @ContractNo = tblContracts.ContractNo
)

Welche scheint als weit mehr Sinn zu machen, was Sie versuchen, für den Fall Anweisung zu verwenden.

Edit: Ich must've die Frage etwas falsch verstanden - der fehlende param bedeutet in der Regel, dass der Parameter (in diesem Fall @ContractNo) nicht im Rahmen Ihrer Abfrage / Prozedur deklariert. Aber jemand darauf schon, dass aus, so kann ich bei einem Kredit für das nicht nehmen.

Der Grund für die Case-Anweisung, einschließlich der gesamten „Wenn es 0 ist, den Parameter geben, und andernfalls gibt nur den Parameter“ war es zu testen, um zu versuchen, die Syntax richtig zu machen. Ursprünglich hatte ich versucht zu sagen: „Wenn es 0 ist, dann in‚%‘übergeben, jeden Wert zurückzukehren. Der Code, den ich geschrieben da drin war, weil ich immer‚Invalid Parameter‘gehalten und dachte, es ist etwas falsch mit meiner Syntax sein muss. Wenn ich trennte es in Eckwert Anpassung wie so,

WHERE @ContractNo = tblContracts.ContractNo

es zurückgegebenen Datensätze in Ordnung. Lassen Sie mich ein bisschen mehr erklären.

ich von einer Reihe von verschiedenen Tabellen bin ziehen, und Filtern der Inhalte mit Informationen nicht in der select-Anweisung enthalten (das heißt tblContracts nicht Informationen von ihm Select gezogen hat, ist es nur in Wo verwendet). Der Benutzer wird von einem Kombinationsfeld auswählen, die die verschiedenen Vertragszahl haben wird, sowie ein Standardwert von ‚B‘.

Ich werde ein Ereignis haben, denn wenn der Index des Kombinationsfeld ändert. Wenn es ‚Alle‘, 0 wird als Parameter übergeben, und ich will keine Filterung erfolgen. Ansonsten möchte ich nur die Informationen für die Vertragsnummer (der Grund für Else @ContractNo).

Haben Sie nicht so etwas wie das bedeuten?

SELECT * 
    FROM tblContracts
    WHERE     
    CASE 
       WHEN tblContracts.ContractNo = 0 THEN @ContractNo 
       ELSE tblContracts.ContractNo
    END = tblContracts.ContractNo

Wo @ContractNo ist Variable gleichen Datentyp wie tblContracts.ContractNo

Warum brauchen Sie auch einen Fall Aussage?

@ContractNo = 0 then (0 = tblContracts.ContractNo) sonst @ContractNo dann (@ContractNo = tblContracts.ContractNo)

Das macht keinen Sinn, da Sie einfach dies als

schreiben könnten

Wo @contractNo = tblContracts.contractNo

Ist der Vertragsnummer tatsächlich ein numerisches oder ist es eine Zeichenfolge, die eine numerisch sein immer geschieht. Überprüfen Sie Ihre Datentypen zwischen dem Tisch und dem Parameter und der CASE-Anweisung (zum Beispiel „= 0“ oder „=‚0‘“)

Diese Syntax funktionieren soll (es funktioniert in Oracle)

WHERE CASE WHEN tblContracts.ContractNo = 0 
           THEN @ContractNo 
           ELSE tblContracts.ContractNo
      END = tblContracts.ContractNo

, wenn Sie sagen:

  

ich von einer Reihe von verschiedenen Tabellen bin ziehen, und Filtern der Inhalte mit Informationen nicht in der select-Anweisung enthalten (das heißt tblContracts nicht Informationen von ihm Select gezogen hat, ist es nur in Wo verwendet). Der Benutzer wird von einem Kombinationsfeld auswählen, die die verschiedenen Vertragszahl haben wird, sowie ein Standardwert von ‚B‘.

Dann klingt es mir, dass eine „Wo existiert“ Klausel haben sollte. da Ihr keine Informationen aus dieser Tabelle ziehen?!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top