简体   繁体   English

在PostgreSQL中循环时如何选择多个列?

[英]How to select multiple columns while looping in postgresql?

Please tell me how to do this i want to select multiple column while looping.. 请告诉我该怎么做,我想在循环时选择多列。

create or replace function insert_date_dimension("date" date)
 returns setof date as $$
declare
    dat date;
    start_date date;
    end_date date;
begin
    start_date := '2016/01/01';
    end_date := '2016/12/31';
    while start_date <= end_date loop
        --return next  start_date;
        select start_date,date_part('week',start_date),date_part('quarter',start_date),to_char(start_date, 'day'),to_char(start_date, 'month'),
        extract(year from current_date),extract(month from current_date);
        start_date:= start_date + interval  '1 day';
    end loop;
end;

$$ language plpgsql; $$语言plpgsql;

ERROR:  query "SELECT    start_date,date_part('week',start_date),date_part('quarter',start_date),to_char(start_date, 'day'),to_char(start_date, 'month'),
        extract(year from current_date),extract(month from current_date)" returned 7 columns

CONTEXT: PL/pgSQL function insert_date_dimension(date) line 11 at RETURN NEXT 上下文:PL / pgSQL函数insert_date_dimension(date)第11行位于RETURN NEXT

The error occurs because you would have to use SELECT ... INTO ... in a PL/pgSQL function. 发生错误是因为您必须在PL / pgSQL函数中使用SELECT ... INTO ... Besides, you forgot to RETURN something. 此外,您忘了RETURN

It is much easier to use generate_series ; 使用generate_series容易得多; that way you probably don't even need to define a function, you could just use INSERT INTO ... SELECT ... . 这样,您甚至不需要定义函数,就可以使用INSERT INTO ... SELECT ...

Here is the function as I would write it: 这是我要编写的函数:

CREATE OR REPLACE FUNCTION insert_date_dimension(
   OUT "date" date,
   OUT week integer,
   OUT quarter integer,
   OUT dayname text,
   OUT monthname text,
   OUT year integer,
   OUT month integer
) RETURNS SETOF RECORD STABLE LANGUAGE plpgsql AS
$$DECLARE
   dat date;
   start_date timestamp := '2016-01-01 00:00:00';
   end_date timestamp := '2016-12-31 00:00:00';
BEGIN
   RETURN QUERY SELECT
         d::date,
         date_part('week', d)::integer,
         date_part('quarter', d)::integer,
         to_char(d, 'day'),
         to_char(d, 'month'),
         date_part('year', d)::integer,
         date_part('month', d)::integer
      FROM generate_series(start_date, end_date, '1 day') d(d);
END;$$;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM