【问题标题】:PostgreSQL execute + datePostgreSQL 执行 + 日期
【发布时间】:2012-03-19 14:56:27
【问题描述】:

我正在尝试在 PL/pgSQL 过程中创建 SQL 选择语句。直到我不得不在选择中添加date 之前一切都很好。问题是要比较 select 子句中的日期,我的日期必须用单引号 '' 括起来(例如'01.01.2011'),但在我的情况下,它已经是 text 类型,我不能在那里添加它.

下面是一个应该有同样问题的示例代码:

CREATE OR REPLACE FUNCTION sample(i_date timestamp without time zone)
  RETURNS integer AS
$BODY$
DECLARE
  _count integer := 0;
  _sql text := '';
BEGIN

  IF i_date IS NOT NULL THEN
   _cond := _cond || ' AND t.created>' || i_date;
END IF;

_sql := 'SELECT count(*) FROM test t WHERE 1=1' || _cond;

EXECUTE _sql INTO _count;
RETURN _count;

END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

还有其他方法可以“逃避”约会吗?还是有其他建议?

【问题讨论】:

  • 我有点糊涂,你的意思是你的例子中的t.created是数据库中的varchar吗?
  • 不,是日期。但是如果 i_date 周围没有 '' ,那么它就是在做算术方程而不是比较两个日期。

标签: sql postgresql date


【解决方案1】:

要在动态构建和执行的 SQL 字符串中安全有效地使用插入 ,有多种可能性。最好的方法是像这样使用USING clause

CREATE OR REPLACE FUNCTION sample(_date timestamp without time zone)
RETURNS integer AS
$BODY$
BEGIN
    RETURN QUERY EXECUTE '
    SELECT count(*)::int
    FROM   test t
    WHERE  t.created > $1'
    USING  _date;
END;
$BODY$ LANGUAGE plpgsql VOLATILE;

这实际上是一个不好的例子,因为它可以简化为:

CREATE OR REPLACE FUNCTION sample(_date timestamp)
RETURNS integer AS
$BODY$
    SELECT count(*)::int
    FROM   test
    WHERE  created > $1;
$BODY$ LANGUAGE sql;

另一种方法是使用quote_literal()
我在这里写了更多关于dynamic SQL in plpgsql 的内容。

【讨论】:

  • 谢谢欧文! quote_literal() 非常适合我。
【解决方案2】:

我正在尝试以这种方式执行相同的命令

declare
    _count integer := 0;
    _sql text := '';
begin
    _sql := 'SELECT count(*) FROM test t WHERE 1=1';
    EXECUTE _sql INTO _count;
    RETURN _count;
end;

并且在声明语句之后它在_integer处给出错误......不知道如何解决这个问题..我什至尝试了postgre原始站点和文档示例中的几个例子,但它们甚至没有运行SQL server 允许运行...

【讨论】:

  • 你必须创建函数并调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
相关资源
最近更新 更多