相关疑难解决方法(0)

Postgres FOR LOOP

我试图从表中获取25个15,000个ID的随机样本.而不是每次都手动按下运行,我正在尝试循环.我完全理解的不是Postgres的最佳用法,但它是我的工具.这是我到目前为止:

for i in 1..25 LOOP
   insert into playtime.meta_random_sample
   select i, ID
   from   tbl
   order  by random() limit 15000
end loop
Run Code Online (Sandbox Code Playgroud)

random postgresql stored-procedures for-loop plpgsql

46
推荐指数
3
解决办法
14万
查看次数

如何在plpgsql中使用记录类型变量?

如何将存储在记录类型变量中的查询结果用于同一存储函数中的另一个查询?我使用Postgres 9.4.4.

用这样的表:

create table test (id int, tags text[]);
insert into test values (1,'{a,b,c}'),
                        (2,'{c,d,e}');
Run Code Online (Sandbox Code Playgroud)

我写了一个函数(简化),如下所示:

CREATE OR REPLACE FUNCTION func(_tbl regclass)
RETURNS TABLE (t TEXT[], e TEXT[])
LANGUAGE plpgsql AS $$
DECLARE
  t RECORD;
  c INT;
BEGIN
  EXECUTE format('SELECT id, tags FROM %s', _tbl) INTO t;
  SELECT count(*) FROM t INTO c;
  RAISE NOTICE '% results', c;
  SELECT * FROM t;
END
$$;
Run Code Online (Sandbox Code Playgroud)

......但没有奏效:

select func('test');
Run Code Online (Sandbox Code Playgroud)
ERROR:  42P01: relation "t" does not exist
LINE 1: SELECT count(*) FROM …
Run Code Online (Sandbox Code Playgroud)

postgresql variables function plpgsql table-variable

16
推荐指数
1
解决办法
3万
查看次数

PostgreSQL中基于游标的记录

我正在尝试使用游标来连接多个表的查询.我已经看到oracle有一个基于游标的记录.当我为Postgres尝试相同时,它会抛出一些错误.我怎么能在Postgres做同样的事情?

CREATE OR REPLACE FUNCTION avoidable_states()
RETURNS SETOF varchar AS
$BODY$
DECLARE
    xyz CURSOR FOR select * from address ad
                            join city ct on ad.city_id = ct.city_id;    
    xyz_row RECORD;
BEGIN   
    open xyz;

    LOOP
    fetch xyz into xyz_row;
        exit when xyz_row = null;
        if xyz_row.city like '%hi%' then
            return next xyz_row.city;               
        end if;
    END LOOP;
    close xyz;  
END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

ERROR:  relation "xyz" does not exist
CONTEXT:  compilation of PL/pgSQL function "avoidable_states" near line 4
Run Code Online (Sandbox Code Playgroud)

postgresql loops plpgsql cursor

13
推荐指数
2
解决办法
5万
查看次数

从表变量中选择

我试图保存SELECT查询的结果,传递它,并在另一个PL/pgSQL函数中重用它:

DECLARE
  table_holder my_table; --the type of table_holder is my_table;
  result text;

BEGIN
  SELECT * INTO table_holder FROM table_holder ;

  result = another_function(table_holder);  
  return result;
END
Run Code Online (Sandbox Code Playgroud)

代码another_function(table_holder my_table)分别为:

BEGIN

  RETURN QUERY
  SELECT col FROM table_holder where id = 1;

END
Run Code Online (Sandbox Code Playgroud)

是否可以对SELECT变量运行查询?如果没有,有没有办法解决这个限制?

我正在使用PostgreSQL 9.2.

postgresql plpgsql postgresql-9.2

4
推荐指数
1
解决办法
1万
查看次数

窗口函数或公用表表达式:计算范围内的前一行

我想使用窗口函数为每一行确定满足特定条件的先前记录的总数.

一个具体的例子:

clone=# \d test
              Table "pg_temp_2.test"
 Column |            Type             | Modifiers 
--------+-----------------------------+-----------
 id     | bigint                      | 
 date   | timestamp without time zone | 
Run Code Online (Sandbox Code Playgroud)

我想知道每个date'之前1小时'内的行数date.

我可以使用窗口功能吗?或者我需要调查CTE吗?

我真的希望能够写出像(不工作)的东西:

SELECT id, date, count(*) OVER (HAVING previous_rows.date >= (date - '1 hour'::interval))
FROM test;
Run Code Online (Sandbox Code Playgroud)

我可以通过加入测试来编写这个,如下所示 - 但这不会扩展到特别大的表.

SELECT a.id, a.date, count(b.*)-1 
FROM test a, test b 
WHERE (b.date >= a.date - '1 hour'::interval AND b.date < a.date)
GROUP BY 1,2
ORDER BY 2;
Run Code Online (Sandbox Code Playgroud)

这是我可以用递归查询做的事吗?还是定期的CTE?CTE不仅仅是我所知道的很多东西.我有一种感觉,我很快就会去.:)

sql postgresql plpgsql common-table-expression window-functions

4
推荐指数
1
解决办法
2584
查看次数