multicols bigint[] aus function zu einem bigint[] zusammenführen

Hi, ich habe gerade einen Knoten im Hirn und brauche eure Hilfe.

ich habe eine tabelle IDS mit eindeutiger id(bigint)

[TABLE]
[TR]
[TD]id
[/TD]
[TD][/TD]
[TD]value
[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]1
[/TD]
[TD][/TD]
[TD]a
[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]2
[/TD]
[TD][/TD]
[TD]b
[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]3
[/TD]
[TD][/TD]
[TD]c
[/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]

nun habe ich eine function die verschiedene (für das problem unerhebliche) beziehungen herstellt und mir die ids in arrays ausspuckt.

select function(x) from tabelle y;

[TABLE]
[TR]
[TD]{1}
[/TD]
[/TR]
[TR]
[TD]{2,3}
[/TD]
[/TR]
[/TABLE]

nun möchte ich alle einträge aus der tabelle IDS selektieren deren id in den arrays stecken.

Bsp.

select id from IDS where id = ANY(select function(x) from tabelle y)

sagt mir >> more than one row returned by a subquery used as an expression.

also möchte ich das ergebnis von select function(x) from tabelle y zusammenführen so das

[TABLE]
[TR=“class: px"wysiwyg_dashes_tr”"]
[/TR]
[TR]
[TD]{1}
[/TD]
[/TR]
[TR]
[TD]{2,3}
[/TD]
[/TR]
[/TABLE]

zu

{1,2,3} oder von mir aus auch {2,3,1} us.w. wird. jedenfalls das aus den multicols der function eine col wird mit allen werten die es enthält. pgsql kann dazu eingesetzt werden. DB ist Postgres 8.3

Bitte nicht FOR LOOP. das würde die Sache endlos langsam machen.

Liebe Grüße

Sigh

Du könntest mit array_to_string die Arrays in Strings zerlegen und dann wieder mit string_agg wieder die Strings zu einem einzelnen Array aggregieren.


Oder auf Arrays verzichten.



Andreas

es gibt kein string_agg auf der 8.3 :frowning: (

habe es auch schon so gehabt das die function(x) kein array zurückgibt sondern die ids

select function(x) from tabelle y where x = 1;

[TABLE]
[TR]
[TD]function
[/TD]
[/TR]
[TR]
[TD]1
[/TD]
[/TR]
[TR]
[TD]2
[/TD]
[/TR]
[/TABLE]

aber das funktioniert dann nicht mit der ganzen tabelle

function(x) from tabelle y where x IN(1,2);

set-valued function called in context that cannot accept a set

deswegen der Umweg über das Array. Wenn das problem mit dem Set lösbar ist, will ich auch lieber ohne arrays.

Kann man sich bauen:

PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: User-Defined Aggregates
array_accum

Man kann natürlich auch Updaten …


Andreas

Updaten steht in den Sternen. Muss durch alle Test prozesse durch etc… Will ja auch

wg. array_accum

select array_accum(array_to_string(function(x),’,’)) from table y;

{1,"2,3"}
setze ich das in die nächste ein

select id from IDS where id = ANY( (select array_accum(array_to_string(function(x),’,’)) from table y) )

kommt leider

ERROR: operator does not exist: bigint = text[]
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

auweia

Updaten steht in den Sternen. Muss durch alle Test prozesse durch etc… Will ja auch :smiley:

wg. array_accum

select array_accum(array_to_string(function(x),’,’)) from table y;

[TABLE]
[TR]
[TD]{1,“2,3”}
[/TD]
[/TR]
[/TABLE]

setze ich das in die nächste ein

select id from IDS where id = ANY( (select array_accum(array_to_string(function(x),’,’)) from table y) )

kommt leider

ERROR: operator does not exist: bigint = text[]
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.

mache ich es ohne array_to_string

select array_accum(function(x)) from table y;

kommt:

ERROR: could not find array type for data type bigint[]

öhm mache ich sowas verrücktes wie

select string_to_array(array_to_string(array_accum(array_to_string(function(x),’,’)),’,’),’,’) from table y

kommt tatsächlich

{1,2,3} raus

^^

mit schnell hat das dann aber auch nixmehr zu tun.