Re: IF ELSEIF Funktion in PL/pgSQL erstellen

From: Patryk Kordylewski <pk(at)fooby(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: IF ELSEIF Funktion in PL/pgSQL erstellen
Date: 2013-12-19 18:30:47
Message-ID: 52B33B57.4090406@fooby.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

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

In response to

Responses

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Gunnar Nick Bluth 2013-12-20 14:31:24 Re: IF ELSEIF Funktion in PL/pgSQL erstellen
Previous Message Gunnar Oehmichen 2013-12-19 17:16:00 IF ELSEIF Funktion in PL/pgSQL erstellen