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
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 |