Spalte in Abfrage je nach Wert bestimmen

Andey

Benutzer
Beiträge
9
Hallo,

wieder hab ich mal ein Problem, das im Internet schon echt häufig diskutiert wurder - ich aber ohne Hilfestellung nicht auf die richtige Lösung komm ;)

Besteht die Möglichkeit in einer SQL-Abfrage direkt anzugeben, dass unter Bestimmten Bedingungen unterschiedliche Spalten zur Ausgabe herangezogen werden?

Also etwas konkreter:
Ich habe eine Spalte mit Privaten Mailadressen und eine mit allgemeinen Mailadressen.
Nun mag ich prüfen, ob es einen Wert in der Spalte "Private Mailadresse" gibt und ob dieser gültig ist - falls ja, soll dieser Wert als "Mail" ausgegeben werden.
Sollte das Ergebnis aus "Private Mailadresse" NULL oder ungültig sein, soll der Wert aus der Spalte "allgemeine Mailadresse" wieder auf Inhalt uns Korrektheit geprüft werden und falls vorhanden und korrekt dieser als "Mail" ausgegeben werden. Trifft auch das nicht zu, soll nichts ausgegeben werden.

Sehr viel Text für ein wahrscheinlich sehr einfaches Problem und eine noch einfachere Lösung...

Ich hoffe, es gibt eine machbare Lösung und jemand von euch kennt diese ;)

Ich benutze ORACLE 10g ohne Schreibrechte
 
Werbung:
Etwas in der Art:

Code:
select ..., 
       case
          when private_mail is not null and is_valid(private_maiL) then private_mail
          when is_valid(allgemeine_mail) then allgemeine_mail
       end as mail, 
       ...
from ...

Du hast nicht gesagt wie Du prüfen möchtest ob eine Mailadresse "gültig" ist. Im obigen Code macht das die Funktion is_valid(). Du musst das halt mit dem Ausdruck/Funktionsaufruf ersetzen der die Gültigkeit prüfen kann.
 
Werbung:
CASE ist eine Möglichkeit, eine Funktion wie isnull() (MSSQL) eine andere (kann natürlich nur auf NULL prüfen). Wichtig ist natürlich, das beide Spalten vom selben Datentyp sind, sonst gibt es vermutlich einen Fehler.

Du kannst auch zwei Selects machen und mit UNION verbinden. Darüber kann man dann auch beide E-Mail Adressen auflisten, wenn beide gültig sind - möglicherweise sinnvoll.
Code:
WITH tabelle(asdf,privat,allgemein) AS (
    SELECT    1,'a@a.de','b@b.de' UNION ALL
    SELECT    2,'c@c.de',NULL UNION ALL
    SELECT    3,NULL,NULL
    )
Code:
SELECT    asdf,
        (    CASE
            WHEN    privat IS NOT NULL
            AND        privat LIKE '%@%.%'
            THEN    privat
            WHEN    allgemein IS NOT NULL
            AND        allgemein LIKE '%@%.%'
            THEN    allgemein
            ELSE    NULL
            END ) AS mail
FROM    tabelle
Code:
SELECT    asdf,
        isnull(privat,allgemein) AS mail
FROM    tabelle
Code:
SELECT    asdf,
        privat AS mail
FROM    tabelle
WHERE    privat IS NOT NULL
AND        privat LIKE '%@%.%'
UNION ALL
SELECT    asdf,
        allgemein AS mail
FROM    tabelle
WHERE    allgemein IS NOT NULL
AND        allgemein LIKE '%@%.%'
 
Zurück
Oben