Re: IF ELSEIF Funktion in PL/pgSQL erstellen
Patryk Kordylewski <[email protected]> Thu, 19 Dec 2013 19:30:47 +0100
| Newsgroups | gmane.comp.db.postgresql.german |
|---|---|
| Message-ID | <[email protected]> |
Hallo Gunnar,
"table" ist kein gÃŒltiger Datentyp. Du kannst deine View als Datentyp
angeben:
CREATE FUNCTION taxon_level (p_record viewname) ...
Dann kannst du innerhalb der Funktion "p_record" als Variable verwenden,
finde ich auch besser als $1.
GruÃ,
Patryk
On 19.12.2013 18:16, Gunnar Oehmichen wrote:
> 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,
>
--
Sent via pgsql-de-allgemein mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein