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