Announcement

Collapse
No announcement yet.

Problem mit CASE Anweisung in SQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit CASE Anweisung in SQL

    Hallo Zusammen

    ich habe folgendes Problem in einer Stored Procedure auf einem MS SQL Server 2000.

    Die SP soll das Ergebnis einer SELECT-Abfrage auf eine Tabelle mit Namen Orders zurückgeben. In der Tabelle gibt ein Integerfeld mit Namen STATUS, das die Werte 1 bis 6 annehmen kann.

    Als Parameter soll der SP ein möglicher Wert übergeben werden, auf den das Feld Status gefiltert werden soll.

    So funzt es auch ganz gut:

    CREATE PROCEDURE spOrdersItemsMerged<br>
    @Status int<br>
    AS<br>
    <br>
    SELECT FROM dbo.orders WHERE dbo.orders.status = @Status<br>
    <br>
    GO

    Klappt soweit. Jetzt gibt es aber auch die Möglichkeit, dass der Benutzer keinen Filterwert übergeben kann, d.h. er will die Sätze mit allen Stati 1-6 sehen (dazu übergebe ich den Wert 0)

    Ich hab mir schon dir Finger gebrochen mit CASE, komme aber zu keiner syntaktisch richtigen Lösung, z.b. so

    CREATE PROCEDURE spOrdersItemsMerged<br>
    @Status int<br>
    AS<br>
    <br>
    SELECT FROM dbo.orders <br>
    WHERE dbo.Orders.OrderState IN<br>
    CASE<br>
    WHEN @Status = 0 THEN (1,2,3,4,5,6)<br>
    WHEN @Status > 0 THEN (@Status)<br>
    END<br>
    <br>
    GO<br>

    Läßt sich gar nicht speichern, weil in der Nähe von "," in der ersten CASE-Anweisung ein Fehler ist.

    Kann mir irgendjemand für dieses Problem eine gültige Lösung präsentieren. Ich will übrigens keine Lösung mit IF @Status = 0 THEN ELSE und jeweils einem SELECT Statement in THEN und ELSE Zweig sondern möchte gerne mit einem SELECT Statement auskommen.

    Kann mit da jemand helfen ?

    Gruß

    Jan

  • #2
    Warum willst Du kein If then else ?
    Das ist übersichtlich und sicher auch performanter als eine where-Bedingung.
    In Oracle würde ich das so versuchen:

    select ... from ...
    where status = nvl(aStatus, status)

    Ich kenne aber SQL-Server nicht.
    nvl bedeutet ist aStatus NULL dann nimm status.

    Gruß Joachi

    Comment

    Working...
    X