【问题标题】:Syntax error at or near ",""," 处或附近的语法错误
【发布时间】:2017-05-31 04:49:07
【问题描述】:

我在使用此功能时遇到问题,不知道如何解决。

Create Function Quy(sdate timestamp)
returns integer as $$
declare
        numbmonth integer;
        quy integer;
Begin
    numbmonth := Date_part('month',sdate);
    If numbmonth < 4 then
        quy := 1;
    else if numbmonth < 7 then
        quy := 2;
    else if numbmonth < 10 then
        quy := 3;
    else quy := 4;
    return quy;
END;
$$
LANGUAGE plpgsql;

当我尝试运行代码时会发生这种情况:

ERROR:  syntax error at or near ";"
LINE 16: END;

我真的不明白这有什么问题。

【问题讨论】:

  • 尝试删除 ; END 之后?

标签: postgresql function if-statement plpgsql


【解决方案1】:

多个语法错误。该函数将像这样工作:

CREATE OR REPLACE FUNCTION quy(sdate timestamp)
  RETURNS integer AS
$func$
DECLARE
   numbmonth integer := date_part('month', sdate);
   quy integer;
BEGIN
   IF numbmonth < 4 THEN
      quy := 1;
   ELSIF numbmonth < 7 THEN
      quy := 2;
   ELSIF numbmonth < 10 THEN
      quy := 3;
   ELSE
      quy := 4;
   END IF;
   RETURN quy;
END
$func$  LANGUAGE plpgsql;

Consult the manual for the basic syntax of IF.

但那是无稽之谈。要获得一年中的季度,请在一个简单的表达式中使用字段说明符 QUARTERdate_part() or EXTRACT()

EXTRACT(QUARTER FROM $timestamp)

EXTRACTdate_part() 的标准 SQL 等效项。
要么返回double precision,所以如果需要,请转换为integer (::int)。

如果你还需要一个函数:

CREATE OR REPLACE FUNCTION quy(sdate timestamp)
  RETURNS int LANGUAGE sql IMMUTABLE AS
'SELECT EXTRACT(QUARTER FROM $1)::int';

$1 是对第一个函数参数的引用。相当于示例中的sdate$-notation 适用于任何版本的 Postgres,而 SQL 函数中的命名参数引用仅在 Postgres 9.2 中引入。见:

dbfiddle here

【讨论】:

  • 第一个函数在最后一行出现语法错误,第二个函数的结果返回 5,你能帮我解释一下 datep_part 中的 $1 吗?我是 SQL 新手
  • @Mr.X:对不起,简单函数中的表达式有错误。我修好了它。但是第一个语法错误?我不这么认为。查看演示:dbfiddle.uk/… 您应该始终向您的 Postgres 版本提供任何相关问题。
  • @Mr.X:再想想,还有一个更简单的解决方案。考虑更新。
  • 谢谢,我对Extract了解不多,但我会用它
  • @Mr.X:别误会,date_part('quarter', $1) 也可以。只是滑入标准 SQL 语法。
猜你喜欢
  • 2018-01-26
  • 2014-04-26
  • 2017-02-20
  • 2013-09-10
  • 2017-06-10
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
相关资源
最近更新 更多