在postgresql

时间:2017-10-12 16:37:25

标签: sql database postgresql database-design

我正在尝试编写一个postgresql函数,该函数接收一个数组并返回用户不具有属于该数组的id。我写了这样的话:

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;

但它会像这样抛出错误

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.

我也试过使用CAST功能,但是没有用。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您无法在阵列上使用IN运算符。您应该使用ALL()代替:

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

请注意,仅当my_user.user_info.user_id的类型为文本时,此方法才有效。如果它是一个整数列,那么你应该使用一个整数数组作为参数:

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;