Announcement

Collapse
No announcement yet.

Noob-Frage ;) : CASE Anweisung im SELECT (kriege immer wieder Fehler)

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

  • Noob-Frage ;) : CASE Anweisung im SELECT (kriege immer wieder Fehler)

    Hallo Hallo

    ich beschäftige mich erst seit ein paar Tagen mit SQL und stehe mal wieder vor einem Problem, in einer Abfrage will ich eine neue Spalte einfügen deren Inhalte entweder 'Eigenleistung' oder 'Fremdleistung' sein soll, je nachdem wie die "Belegnummer"- Spalte aussieht.
    Nachdem mir Falk bei meinem letzten Problem etwas geholfen hat, hat er mir diesen Link Einführung in SQL gegeben und ich dachte mir super das Problmem was ich nun habe lässt sich ganz schnell durch einen CASE Befehl lösen:

    Also schnell getippt und bei der Überprüfung der Syntax keine Fehler, nur klappt die CASE Anweisung nicht:
    Code:
    CASE Belegnummer
                WHEN 'P%' THEN 'Eigenleistung'
                ELSE 'Fremdleistung'
           END As 'FL/EL'
    in der "Belegnummer"-Spalte können nur zum einen Werte wie "005" "099" "123" "2009-12-03" stehen wo ein "Fremdleistung in der FL/EL Spalte stehen soll,
    und es gibt Werte in "Belegnummer" wie: "P02-172/1234", hier soll nun "Eigenleistung" ausgegeben werden

    Ich dachte ich hätte das durch das 'P%' gelöst aber Pustekuchen

    habs auch schon mit LIKE in der CASE Anweisung probiert z.B.
    Code:
    CASE Belegnummer
                WHEN Belegnummer LIKE 'P%' THEN 'Eigenleistung'
                ELSE 'Fremdleistung'
           END As 'FL/EL'
    aber dann sagt er "Fehler in der Nähe der "LIKE" Syntax" und ich finde einfach keine Lösung.

    (wie gesagt neu bei SQL) würde mich also nciht wundern wenn nur eine Zeichen fehlt oder so
    Danke
    Steffen

  • #2
    Hallo Steffen,

    ist wirklich nur eine Kleinigkeit:
    [highlight=sql]WITH tmp AS
    (
    SELECT 'P02-172/1234' AS [Belegnummer]
    UNION ALL
    SELECT '005' AS [Belegnummer]
    )

    SELECT [Belegnummer],
    CASE WHEN [Belegnummer] LIKE 'P%'
    THEN 'Eigenleistung'
    ELSE 'Fremdleistung'
    END AS 'FL/EL'
    FROM tmp[/highlight]
    lg chapster

    Comment


    • #3
      Zum besseren Verständnis solltest du dir das einmal durchlesen: CASE (Transact-SQL)

      lg chapster

      Comment


      • #4
        Hi Chapster

        aaahh also ich hab also eigentlich nur die Klammern um Belegnummer vergessen? -> jetzt klappts,

        mit der WITH Anweisung hat er mir noch eine Syntax Fehler gegeben (die hab ich erstmal wieder rausgenommen, werd aber mal weiterschauen was die bewirkt)

        ...brauche ich also diese "WITH temp" Anweisung? beschleunigt die da was? wie ich das logisch denken/verstehen würde sagt man bei der Abfrage dann sowas wie: "ungefähr so muss das aussehen" ? ..weil die Belegnummern unterscheiden sich ja von den in der WITH Anweisung vorgegebenen

        Danke für die weitere Quelle (hab ich zu meine Links hinzugefügt und werde ich mir dann mal durchlesen)

        gruesse
        Steffen

        Comment


        • #5
          Hallo Steffen,
          Originally posted by Steff86 View Post
          aaahh also ich hab also eigentlich nur die Klammern um Belegnummer vergessen?
          Nein, die Klammern haben nichts zu sagen, das ist nur meine eigenwillige Art SQL-Code zu schreiben
          Damit du verstehst wo der Fehler war habe ich noch den Link nachgesendet. Aber um das nochmal ausdrücklich zu unterstreichen:
          Ein CASE kann auf zwei verschiedene Arten genutzt werden. Entweder man gibt ein Feld an und möchte das es einem der gegebenen Werte entspricht: z.B.
          [highlight=sql]
          SELECT
          CASE '123'
          WHEN '012' THEN 'mahlzeit'
          WHEN '123' THEN 'lunch'
          WHEN '456' THEN 'guten morgen'
          ...
          ...
          ...
          ELSE 'guten Abend'
          END
          [/highlight]
          Das bedeutet, dass der Wert der nach CASE steht (also in diesem Beispiel '123') mit allen Werten die nach WHEN stehen verglichen wird. Trifft ein Ausdruck zu (in diesem Fall 'lunch') wird dieser ausgegeben. Trifft keiner der Werte zu wird das Ausgegeben was in ELSE steht. Gibt man allerdings kein ELSE an und es wird kein Wert gefunden so wird NULL zurückgegeben (NULL bedeutet in SQL sowas wie unbekannt oder nicht definiert). Wichtig bei dieser Art der Verwendung: Nur das was nach dem Keyword CASE steht wird mit allen Werten nach WHEN verglichen!

          ODER

          CASE kann auch so verwendet werden, dass man keinen Wert nach CASE angibt, dafür aber immer einen boolschen Ausdruck (wahr oder falsch) nach WHEN. z.B:
          [highlight=sql]SELECT
          CASE
          WHEN 'a'='b' THEN 'falsch'
          WHEN 'b'='c' THEN 'falsch'
          WHEN 'c'='c' THEN 'richtig'
          END[/highlight]

          Das bedeutet, dass in diesem Beispiel nur 'richtig' ausgegeben werden kann. Denn a ist nicht b und b ist nicht c. Wichtig hier: Nach CASE steht nichts und nach WHEN immer ein boolscher Ausdruck.

          Ich hoffe das war halbwegs verständlich, aber wie gesagt, am besten ließt du dir den Artikel durch und probierst ein paar Beispiele selbst aus.


          Originally posted by Steff86 View Post
          ...brauche ich also diese "WITH temp" Anweisung? beschleunigt die da was?
          Nein, das kannst du auch komplett ignorieren. Das ist nur dazu da um ein paar Beispieldatensätze zu simulieren. Du brauchst nur den Teil von CASE bis END.

          lg chapster

          Comment


          • #6
            aahhh gut jetzt hab ich meinen Fehler gesehen
            (zum durchlesen der Quelle bin ich leider noch nicht gekommen)

            Danke nochmal

            Comment

            Working...
            X