Laden...

[gelöst] Alias für Case-Selectstatement

Erstellt von mosspower vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.130 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren
[gelöst] Alias für Case-Selectstatement

SQL-Server, Version 8-9

Wie kann ich für folgendes Statement in der Where-Klausel auf sendungsnummer zugreifen? Einen Alias bekomme ich nicht hin, da ich immer Fehlermeldungen bekomme (z.B. as bla)

SELECT o.liefernummer, 'sendungsnummer' = 
  CASE 
    WHEN d.sendungsnummer IS NOT NULL THEN d.sendungsnummer 
    ELSE convert(varchar, u.sendungsnummer)
  END FROM [order] o
LEFT OUTER JOIN ups u ON o.liefernummer = u.liefernummer
LEFT OUTER JOIN dtc d ON o.liefernummer = d.liefernummer
WHERE sendungsnummer ???

Ich möchte einfach auf das dynamische Feld in der Where-Klausel zugreifen. Das muss doch irgendwie gehen.
Danke schon mal für eure Hilfe.

3.511 Beiträge seit 2005
vor 15 Jahren

Das muss doch irgendwie gehen.

Nein 😉

Der Alias ist im WHERE-Teil des Statements nicht bekannt. Nur Abfragen, die wiederum auf diese Abfrage zugreifen, wissen von den neuen Spaltenname. Die eigentliche Abfrage, kennt den neuen Spaltennamen noch nicht.

Du hast jetzt zwei Möglichkeiten:
1)
Du setzt den kompletten CASE Block nochmals in den WHERE Teil:


SELECT o.liefernummer, 'sendungsnummer' =
  CASE
    WHEN d.sendungsnummer IS NOT NULL THEN d.sendungsnummer
    ELSE convert(varchar, u.sendungsnummer)
  END FROM [order] o
LEFT OUTER JOIN ups u ON o.liefernummer = u.liefernummer
LEFT OUTER JOIN dtc d ON o.liefernummer = d.liefernummer
WHERE 
  (CASE
    WHEN d.sendungsnummer IS NOT NULL THEN d.sendungsnummer
    ELSE convert(varchar, u.sendungsnummer)
  END) = 'DieSendungsNummer'

Nachteil: Ändert sich was im CASE, muss es an zwei Stellen nachgezogen werden und ist somit fehleranfälliger

2)
Du setzt das Statement als VIEW ab und selektierst auf das VIEW


CREATE VIEW SendungsNummern
AS
  SELECT o.liefernummer, 'sendungsnummer' =
  CASE
    WHEN d.sendungsnummer IS NOT NULL THEN d.sendungsnummer
    ELSE convert(varchar, u.sendungsnummer)
  END FROM [order] o
  LEFT OUTER JOIN ups u ON o.liefernummer = u.liefernummer
  LEFT OUTER JOIN dtc d ON o.liefernummer = d.liefernummer

-- Später
SELECT * FROM SendungsNummern
WHERE sendungsnummer = 'xxx'

Vorteil: Die CASE Bedingung muss nur noch an einer Stelle gepflegt werden. Desweiteren hat man noch die Möglichkeit Indizierte Views zu erstellen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren

@Khalid,

vielen Dank! - dann mache ich eine View - dachte, dass man hier mit einem Alias draufgehen kann.

Gruß

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren

OK, für alle, die es interessiert, es gibt doch eine Lösung, die sieht dann so aus:

aus ....

SELECT o.liefernummer, 'sendungsnummer' =
  CASE
    WHEN d.sendungsnummer IS NOT NULL THEN d.sendungsnummer
    ELSE convert(varchar, u.sendungsnummer)
  END FROM [order] o

... wird

SELECT o.liefernummer,
  CASE d.sendungsnummer
    WHEN IS NOT NULL THEN d.sendungsnummer
    ELSE convert(varchar, u.sendungsnummer)
  END AS myAliasName
FROM [order] o