Ik heb de volgende twee tabellen:
tabel 'elements'
- id SERIAL
- element VARCHAR
tabel 'styles'
- id SERIAL
- style TEXT
- element INTEGER (FOREIGN KEY -> elements(id))
Nu komen sommige 'style'-s uit de tabel 'styles' meerdere malen voor, maar met verschillende elementen.
Ik voer deze query uit en zo wil ik het hebben, werkt perfect:
SELECT style FROM styles GROUP BY style ORDER BY style
Maar, nu wil ik ook netjes een met komma gescheiden lijstje van alle 'element'-s die deze 'style' hebben. Voor zover ik weet kun je niet een subquery concatten, dus schrijf ik er even een functie voor. Ik kom in eerste instantie hier op uit:
CREATE FUNCTION get_all(text) RETURNS text '
DECLARE
style_text ALIAS FOR $1;
elements_text TEXT;
row_data record;
BEGIN
FOR row_data IN (SELECT element FROM elements WHERE id IN ( SELECT element FROM styles WHERE style = style_text)) LOOP
elements_text := elements_text || row_data.element || '', '';
END LOOP;
RETURN elements_text;
END;
' LANGUAGE 'plpgsql';
[edit]De query binnen de functie levert wel het juiste resultaat op als ik 'm los uitvoer:
SELECT element FROM elements WHERE id IN ( SELECT element FROM styles WHERE style = 'color: #FFF;')
Namelijk:
element
---------
a:link
a:hover
body
#main
etc
[/edit]
Als ik nu deze functie uitvoer en er wel resultaten zijn, dan krijg ik:
SQL fout:
ERROR: query "SELECT $1 || $2 || '', ''" returned 2 columns
CONTEXT: PL/pgSQL function "get_all" line 7 at assignment
In statement:
SELECT get_all(style) FROM styles
Of als ik logischerwijs wat dingen wijzig gaat 'ie klagen over een verkeerde integerwaarde, terwijl het juist met strings werkt. Erg raar.
Nu kan ik 'm ook herschrijven, maar dan krijg ik geen error, maar gewoon over NULL:
DECLARE
style_text ALIAS FOR $1;
elements_text TEXT;
elements_this TEXT;
elements_current RECORD;
BEGIN
FOR elements_current IN SELECT element FROM styles WHERE style = style_text LOOP
SELECT INTO elements_this element FROM elements WHERE id = elements_current.element;
elements_text := elements_text || elements_this;
END LOOP;
RETURN elements_text;
END;
Voor de duidelijkheid, ik gebruik dus:
SELECT style, get_all(style) FROM styles GROUP BY style ORDER BY style
Ik werk eigenlijk nooit met het uitlezen van rows via PL/pgSQL, dus misschien dat ik iets over het hoofd zie dat een ervaren FOR-INner wel ziet.
Alvast bedankt voor jullie tijd,
Erik
[edit]Script heeft te maken met CSS generator voor een grote website.[/edit]