2017-10-12 2 views
0

Ich versuche, eine Postgresql-Funktion zu schreiben, die in einem Array und gibt die Benutzer keine ID, die zu dem Array gehört. Ich schrieb etwas wie folgt aus:Senden Array als Parameter in Postgresql

CREATE OR REPLACE FUNCTION user_api.get_user(banned_list TEXT[]) 
    RETURNS SETOF JSONB 
AS $$ 
    SELECT to_jsonb(result) 
    FROM (
    SELECT 
      * 
     FROM my_user.user_info 
     WHERE my_user.user_info.user_id NOT IN (banned_list::TEXT[]) 

) AS result; 
$$ LANGUAGE SQL SECURITY DEFINER; 

Aber es wirft Fehler wie diese

ERROR: operator does not exist text <> text[] 
LINE 24: ...  WHERE my_user.user_info.user_id NOT IN (no... 
                  ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

ich versucht, mit zu CAST-Funktion, funktioniert nicht.

Vielen Dank im Voraus für Hilfe.

Antwort

1

Sie können den Operator IN nicht für ein Array verwenden. Sie sollten ALL() statt:

WHERE my_user.user_info.user_id <> ALL(banned_list) 

Beachten Sie, dass dies gut funktioniert nur, wenn die Art der my_user.user_info.user_id Text. Wenn es eine Integer-Spalte ist, dann sollten Sie ein Array von ganzen Zahlen als das Argument verwenden:

CREATE OR REPLACE FUNCTION user_api.get_user(banned_list int[]) 
    RETURNS SETOF JSONB 
AS $$ 
    SELECT to_jsonb(result) 
    FROM (
    SELECT 
      * 
     FROM my_user.user_info 
     WHERE my_user.user_info.user_id <> ALL(banned_list) 

) AS result; 
$$ LANGUAGE SQL SECURITY DEFINER; 
+0

Danke, das hat funktioniert! – Shafaet

Verwandte Themen