postgreSQL中的DO函数

postgreSQL中的DO函数,postgresql,Postgresql,我想做一个插入,这是一个有点不同,取决于3例。我试着阅读文档,把它转换成一个非匿名的do函数,在stackoverflow上发布了很多帖子,但似乎没有一个能回答我的问题。我的if-else语句对我来说很好,很可能是一个函数语法问题 DO $$ BEGIN IF (SELECT date_start FROM segments_circuits_operation) = '2014-02-14' THEN INSERT INTO circuits_operation (id_circuit, d

我想做一个插入,这是一个有点不同,取决于3例。我试着阅读文档,把它转换成一个非匿名的do函数,在stackoverflow上发布了很多帖子,但似乎没有一个能回答我的问题。我的if-else语句对我来说很好,很可能是一个函数语法问题

DO $$
BEGIN

IF (SELECT date_start FROM segments_circuits_operation) = '2014-02-14' THEN
INSERT INTO circuits_operation (id_circuit, description, date_start, date_end, speed, length, duration, truck_type, tempest_day)
SELECT seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end, seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start), seg.truck_type, "14 février 2014"
FROM segments_circuits_operation seg INNER JOIN circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

ELSE IF (SELECT date_start FROM segments_circuits_operation) = '2014-03-14' THEN
INSERT INTO circuits_operation (id_circuit, description, date_start, date_end, speed, length, duration, truck_type, tempest_day)
SELECT seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end, seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start), seg.truck_type, "14 mars 2014"
FROM segments_circuits_operation seg INNER JOIN circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

ELSE IF (SELECT date_start FROM segments_circuits_operation) = '2014-03-13' THEN
INSERT INTO circuits_operation (id_circuit, description, date_start, date_end, speed, length, duration, truck_type, tempest_day)
SELECT seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end, seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start), seg.truck_type, "13 mars 2014"
FROM segments_circuits_operation seg INNER JOIN circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

END IF;
END
$$
我有个语法错误。我对postgreSQL不是很流利,所以答案可能是显而易见的,但目前对我来说不是

ERROR:  syntax error at end of input
LINE 21: $$
         ^

结束后的分号

end;
$$
如果我理解你的意思,那么整个过程可以是简单的sql:

insert into circuits_operation (
    id_circuit, description, date_start, date_end,
    speed, length, duration, truck_type, tempest_day
)
select
    seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end,
    seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start),
    seg.truck_type,
    to_char(seg.date_start, 'DD month YYYY')
from
    segments_circuits_operation seg
    inner join
    circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

结束后的分号

end;
$$
如果我理解你的意思,那么整个过程可以是简单的sql:

insert into circuits_operation (
    id_circuit, description, date_start, date_end,
    speed, length, duration, truck_type, tempest_day
)
select
    seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end,
    seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start),
    seg.truck_type,
    to_char(seg.date_start, 'DD month YYYY')
from
    segments_circuits_operation seg
    inner join
    circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

结束后的分号

end;
$$
如果我理解你的意思,那么整个过程可以是简单的sql:

insert into circuits_operation (
    id_circuit, description, date_start, date_end,
    speed, length, duration, truck_type, tempest_day
)
select
    seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end,
    seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start),
    seg.truck_type,
    to_char(seg.date_start, 'DD month YYYY')
from
    segments_circuits_operation seg
    inner join
    circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

结束后的分号

end;
$$
如果我理解你的意思,那么整个过程可以是简单的sql:

insert into circuits_operation (
    id_circuit, description, date_start, date_end,
    speed, length, duration, truck_type, tempest_day
)
select
    seg.id_segment, cir.nomcircuit, seg.date_start, seg.date_end,
    seg.speed_average, cir.shape_leng, (seg.date_end - seg.date_start),
    seg.truck_type,
    to_char(seg.date_start, 'DD month YYYY')
from
    segments_circuits_operation seg
    inner join
    circuits_wgs_1984_p cir on seg.id_segment = cir.objectid;

使用
ELSIF
而不是
ELSE IF

使用
ELSIF
而不是
ELSE IF

使用
ELSIF
而不是
ELSE IF

使用
ELSIF
而不是
ELSE IF

elseif
。关键字ELSIF也可以拼写为elseif for
elseif
。关键字ELSIF也可以拼写为elseif for
elseif
。关键字ELSIF也可以拼写为elseif for
elseif
。关键词ELSIF也可以拼写为ELSEIFI从未用过这个例子,但是一旦我运行了你的查询,所有的结果都很完美,除了tempest_day是空的。您的查询似乎合乎逻辑,但出于某种原因,在tempest_day中没有插入任何内容。这是一个没有时区数据类型的时间戳,如果它有助于了解原因的话:/@Yakobu更新的版本更加健壮和灵活更新的版本确实会有所不同,谢谢(:我还没有用过这个例子,但是一旦我运行了你的查询,除了tempest_day是空的之外,所有的查询都运行得很好。你的查询似乎是合乎逻辑的,但出于某种原因,tempest_day中没有插入任何内容。如果有助于了解原因,它是一个没有时区数据类型的时间戳:/@Yakobu更新的版本更健壮、更灵活更新的版本确实如此。)改变一下,谢谢(:我还没有用过这个例子,但是一旦我运行了你的查询,除了tempest_day是空的之外,所有的查询都运行得很好。你的查询似乎是合乎逻辑的,但出于某种原因,tempest_day中没有插入任何内容。如果有助于了解原因,它是一个没有时区数据类型的时间戳:/@Yakobu更新的版本更健壮、更灵活更新的版本确实如此。)改变一下,谢谢(:我还没有用过这个例子,但是一旦我运行了你的查询,除了tempest_day是空的之外,所有的查询都运行得很好。你的查询似乎是合乎逻辑的,但出于某种原因,tempest_day中没有插入任何内容。如果有助于了解原因,它是一个没有时区数据类型的时间戳:/@Yakobu更新的版本更健壮、更灵活更新的版本确实如此。)请改变一下,谢谢(:不要做
IF()
SQL的WHERE类工作得很好,避免了命令式逻辑。不要做
IF()
SQL的WHERE类工作得很好,避免了命令式逻辑。不要做
IF()
SQL的WHERE类工作得很好,避免了命令式逻辑。不要做
IF()
SQL的WHERE类非常有效,避免了命令式逻辑。