# Datenbank-Abfrage, if im Select



## cz3kit (13. Okt 2010)

Hallöle,

ich sitze hier gerade vor einer Aufgabe und finde leider keinen Weg diese zu lösen ;( 
Ich hab eine DB, die alle Amerikanischen Präsidenten enthält. Eine Spalte ist der Geburtstag und der andere ist der Todestag(sieht so aus: 1732-02-22).
Ich soll jetzt das Alter der Präsidenten anzeigen, also Todestag - Geburtstag. Das geht auch. 
Problem ist, dass es da noch ein paar Präsitenten gibt die noch leben und in der Todestag Spalte null ist. 
Wie kann ich das dann bei denen lösen? Ich habe mir das schon mit if angesehen, aber ich bekomme ständig einen Syntax Error.

```
SELECT  last_name || "  " || first_name as Name,  
if death is null  
     death - birth as Age 
FROM president
```

Der Fehler ist "near is". Hat jemand einen Hinweis? 

Danke


----------



## SlaterB (13. Okt 2010)

welche DB, welche SQL-Syntax? in einer ORACLE-DB gibt des DECODE(), bei kurzer google-Suche kam ich soeben an case() vorbei,
zu if habe ich folgendes Beispiel gefunden
Use IF in select clause : IFFlow ControlSQL / MySQL

deine Variante entspricht keiner der drei, nach welchem offiziellen Tutorial richtest du dich?


----------



## cz3kit (13. Okt 2010)

Oh sorry. Als DB verwenden wir SQLite.

Ich richte mich nach keinem Tutorial, habe noch kein gutes zu SQLite gefunden.


----------



## SlaterB (13. Okt 2010)

eine erneute google Suche 'SQLite select if' (ist eigentlich nicht so schwer oder?)
führte zu
SQLite Query Language: SELECT
insbesondere zu
Syntax Diagrams For SQLite
und da sieht es so aus als wenn CASE WHEN THEN ELSE angebracht wäre,

aber hätte dann nicht schon beim if ein Fehler kommen müssen?
musst du alles ausprobieren, das if aus meinem ersten Link mit Klammern, das CASE hier für SQLite usw.

Use the CASE Statement in a SQL SELECT Clause
Re: [sqlite] Conditional table select


----------



## cz3kit (13. Okt 2010)

Ich werde es mal ausprobieren. Erstmal danke.

Das mit dem Googeln ist immer so eine Sache^^ Wenn einem Partou kein Korrektes Stichwort einfällt.


----------



## LadyMilka (13. Okt 2010)

wieso hast du 





> if death is null


 ?? müßte es nicht eher "if death is not null" oder sowas in der art sein?

vielleicht gehts auch mit "="?

Von der Syntax von SQLite hab ich allerdings keine ahnung


----------



## cz3kit (13. Okt 2010)

> wieso hast du
> Zitat:
> if death is null
> 
> ?? müßte es nicht eher "if death is not null" oder sowas in der art sein?



Das ist ja das selbe in Grün. Ich müsste dann halt nur die Anweisungen umtauschen.


----------



## cz3kit (13. Okt 2010)

Oke habe die Aufgabe mit viel Aufwand gelöst. Der Befehl sieht bei mir jetzt wie folgt aus:

```
SELECT last_name || "  " || first_name Name, death - birth Age FROM president where death is not null
  UNION
  SELECT last_name || "  " || first_name Name, "2010-10-13" - birth Age FROM president where death is null
  ORDER BY Age DESC LIMIT 5
```

Wünsche noch eine Gute Nacht


----------



## Gast2 (14. Okt 2010)

```
SELECT last_name || "  " || first_name Name, 
   CASE 
      WHEN death IS NOT NULL THEN death - birth
      ELSE "2010-10-13" - birth
   END Age
FROM president
ORDER BY Age DESC LIMIT 5
```

Das ganze mit zwei Selects zu machen halte ich für übertrieben - und ist auch wesentlich langsamer. Warscheinlich ist das in deinem anwendungsfall egal aber immerhin.

Du solltest dir auch noch überlegen den Tag heute ("2010-10-13") nicht in das Select einzubauen, sondern über eine SQL Funktion abzurufen.


----------



## cz3kit (14. Okt 2010)

Eine bessere Lösung wollte irgendwie nicht, aber danke fassy für deine Lösung.


----------

