2017-10-03 1 views
0

Ich versuche, einen Schnittpunkt einer Select-Anweisung, die einen Text [] abrufen und einen Schnittpunkt mit einem Text [], die ich dynamisch berechnen, tun.Typenkonflikt in Postgres INTERSECT

Wenn ich dieses Skript ausführen, erhalte ich die Fehler

ERROR: INTERSECT types text[] and text cannot be matched

Wie kann ich diesen Fehler beheben?

do $$ 
declare 
    p json; 
    total_time float; 
    t float; 
    arr text[]; 
    query1 text; 
    arr := '{}'; 
    for j in 80..120 loop 
     arr := array_append(arr, j::text); 
     query1 := 'select sub_id from table where main_id=1 INTERSECT select unnest($1)'; 
     execute 'explain (analyse, format json) ' || query1 using arr into p; 
     t := (p->0->>'Planning Time')::float + (p->0->>'Execution Time')::float; 
     total_time := total_time + t; 
    end loop; 

Schema meiner Tabelle:

db=# \d+ table 
          Table "table" 
    Column  | Type | Modifiers | Storage | Stats target | Description 
---------------+---------+-----------+----------+--------------+------------- 
main_id  | integer |   | plain |    | 
sub_id  | text[] |   | extended |    | 

Antwort

2

sub_id ist ein Array. arr ist ein Array, aber Sie vereinheitlichen es - so ist es nun die Reihenfolge der (Text-) Werte. Sie versuchen, ein INTERSECT eines Array- und Textwerts zu erstellen. Um es zu beheben, entweder beides, oder beides. (Wählen Sie jedoch die richtige aus, da das Ergebnis unterschiedlich ist - Sie schneiden sich entweder auf den Arrays selbst oder auf den in den Arrays enthaltenen Werten.)

SELECT UNNEST(sub_id) FROM table WHERE main_id = 1 
INTERSECT 
SELECT UNNEST(arr)