【问题标题】:PL/pgSQL SELECT into an arrayPL/pgSQL SELECT 到一个数组中
【发布时间】:2012-07-28 17:02:41
【问题描述】:

这是我的函数声明和正文的一部分:

CREATE OR REPLACE FUNCTION access_update()
RETURNS void AS $$
DECLARE team_ids bigint[];
BEGIN
    SELECT INTO team_ids "team_id" FROM "tmp_team_list";

    UPDATE "team_prsnl"
    SET "updt_dt_tm" = NOW(), "last_access_dt_tm" = NOW()
    WHERE "team_id" IN team_ids;
END; $$ LANGUAGE plpgsql;

我希望 team_ids 成为一个整数数组,然后我可以在 UPDATE 语句中使用它。这个函数给我这样的错误:

psql:functions.sql:62: ERROR:  syntax error at or near "team_ids"
LINE 13:  AND "team_id" IN team_ids;

【问题讨论】:

  • 我认为您的选择顺序有误。那不应该是:SELECT team_id INTO team_ids FROM tmp_team_list;

标签: sql postgresql plpgsql postgresql-9.1


【解决方案1】:

使用FROM clause in your UPDATE statement 更快更简单:

UPDATE team_prsnl p
SET    updt_dt_tm = now()
      ,last_access_dt_tm = now()
FROM   tmp_team_list t
WHERE  p.team_id = t.team_id;

除此之外,在使用数组操作时,WHERE 子句必须是

WHERE team_id = ANY (team_ids)

IN 构造适用于集合,而不适用于数组。

【讨论】:

    【解决方案2】:

    SELECT 创建一个数组:

    # select array(  select id from tmp_team_list ) ;
     ?column? 
    ----------
     {1,2}
    (1 row)
    

    IN 运算符是 documented,因为它对右手操作数进行子查询。例如:

    UPDATE team_prsnl SET updt_dt_tm = NOW()
     WHERE team_id IN (SELECT id FROM tmp_team_list);
    

    也许您可以完全避免使用数组,或者尝试提供数组或select from team_ids

    【讨论】:

      【解决方案3】:

      基于其他答案的微小定制。
      如果team_id是普通的int数据类型。

         UPDATE team_prsnl p
          SET    updt_dt_tm = now()
                ,last_access_dt_tm = now()
          FROM   tmp_team_list t
          WHERE  p.team_id = any(array(select team_id from t));
      

      【讨论】:

        猜你喜欢
        • 2012-04-24
        • 2018-02-10
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 2012-12-17
        相关资源
        最近更新 更多