IF ELSEIF Funktion in PL/pgSQL erstellen

From: Gunnar Oehmichen <oehm8895(at)uni-landau(dot)de>
To: Postgres Deutsche Liste <pgsql-de-allgemein(at)postgresql(dot)org>
Subject: IF ELSEIF Funktion in PL/pgSQL erstellen
Date: 2013-12-19 17:16:00
Message-ID: 52B329D0.60803@uni-landau.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Hallo Leute,

ich habe einen View 'taxons' erstellt der (im wesentlichen) folgende
Daten erhält:

family | genus | taxon_name
-------------+-------------+----------------------
SPHAERIIDAE | Pisidium | Pisidium personatum
SPHAERIIDAE | Pisidium | Pisidium sp.
SPHAERIIDAE | Sphaeriidae | Sphaeriidae Gen. sp.
(3 rows)

Die Reihen (jeweils ein Taxon) können jedoch unterschiedlich genau sein.
Die letzte Reihe ist am ungenauesten: Level = Familie, die zweite Reihe
etwas genauer: Level = Gattung, die erste am genauesten: Level = Art.

Dies genaue Information welches taxonomische Level (Familie, Gattung,
oder Art) eine Reihe hat will ich jedoch direkt haben.

Einfach ist es, dies zu extrahieren, da alle Reihen, welche nur eine
Gattung codieren bei taxon_name auf " sp." enden, alle Familien unter
genus auf "idae" (zweiteres ist zooologische Übereinkunft.

Nun habe ich gelesen, dass ich mittels Funktionen Spalten gleich einem
View abspeichern kann.

Ich hätte also gerne:

SELECT *, taxon_level FROM taxons

family | genus | taxon_name | taxon_level
-------------+-------------+----------------------+----------------
SPHAERIIDAE | Pisidium | Pisidium personatum | Art
SPHAERIIDAE | Pisidium | Pisidium sp. | Gattung
SPHAERIIDAE | Sphaeriidae | Sphaeriidae Gen. sp. | Familie
(3 rows)

--- Erste Funktion um zu testen ob ".sp" am ende des Textes enthalten ist

CREATE OR REPLACE FUNCTION is_sp (text) RETURNS BOOLEAN AS '
select $1 ~ '' sp\.$'' as result
' LANGUAGE SQL;

--- Zweite Funktion um zu testen ob "idae" am ende des Textes enthalten ist

CREATE OR REPLACE FUNCTION is_fam (text) RETURNS BOOLEAN AS '
select $1 ~ ''idae$'' as result
' LANGUAGE SQL;

SELECT is_fam ('Batidae')
SELECT is_sp ('Art sp.')

--- Funktion um daraus taxonomisches Level erzuleiten

CREATE FUNCTION taxon_level (table)
RETURNS text
STABLE
AS $$
BEGIN
IF is_sp ($1.taxon_name) = TRUE AND is_fam ($1.genus) = TRUE THEN
return 'Familie'
ELSIF is_sp ($1.taxon_name) = TRUE AND is_fam ($1.genus) = FALSE THEN
return 'Gattung'
ELSE return 'Art' END IF;
END
$$
LANGUAGE plpgsql;

ERROR: syntax error at or near "table"
LINE 1: CREATE FUNCTION taxon_level (table)

Das Problem bei der Sache liegt also darin, wie ich den Input für die
Funktion taxon_level definiere denke ich mal.

Vielen Dank euch,

frohe Feiertage,

--
Gunnar Oehmichen
Quantitative Landscape Ecology
Institute for Environmental Sciences
University Koblenz-Landau
Fortstrasse 7
76829 Landau
Germany
http://www.uni-koblenz-landau.de/landau/fb7/umweltwissenschaften/landscape-ecology/Staff/gunnaroehmichen

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Patryk Kordylewski 2013-12-19 18:30:47 Re: IF ELSEIF Funktion in PL/pgSQL erstellen
Previous Message Patryk Kordylewski 2013-12-19 10:20:40 Re: disable trigger ALL