【问题标题】:Using PostgreSQL parameters with booleans in EXECUTE / USING在 EXECUTE / USING 中使用带有布尔值的 PostgreSQL 参数
【发布时间】:2019-06-28 02:17:36
【问题描述】:

我想为我的动态查询使用参数。我有这样的陈述:

RETURN QUERY EXECUTE 'SELECT * FROM boards AS b WHERE b.slug = $1 AND $2'
USING filter_slug, parent_id_query;

我收到了ERROR: argument of AND must be type boolean, not type text

如果我这样做:

RETURN QUERY EXECUTE 'SELECT * FROM boards AS b WHERE b.slug = ''' || filter_slug || ''' AND ' || parent_id_query;

虽然有效。

我觉得我错过了什么/不理解什么。请帮忙。

【问题讨论】:

  • "x and y" 意味着 x 和 y 都必须呈现为某种形式的布尔表达式——它们需要产生真或假。 b.slug = $1 绝对是 true 或 false,但 $2 只有在它是布尔值时才会这样做。我知道parent_id_query 不是布尔值...是查询吗?如果是这样,您只能将值传递给参数。参数不只是进行字符串替换。
  • 啊,好吧。那很有帮助。我想我可以通过仅用参数替换filter_slug 并保留parent_id_query 来解决它。谢谢。

标签: sql postgresql dynamic plpgsql


【解决方案1】:

您缺少的是如何使用参数。参数不是替换 SQL 语句中任意文本的宏。相反,它们是分配给代码中“变量”的字面值。这些值通常是数字、字符串或日期。

特别是参数不能用于:

  • 标识符(列名和表名)
  • 函数名称
  • 运营商
  • SQL 关键字
  • 一般表达式

因此,不幸的是,您必须在没有通用参数的情况下构造查询的那部分(尽管您可以使用$2 = $3

【讨论】:

  • 或者,简而言之,您可以在SELECT、INSERT, UPDATE` 或DELETE 语句中几乎可以使用常量(文字)的任何地方使用参数。
猜你喜欢
  • 1970-01-01
  • 2016-05-10
  • 2014-07-05
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2011-02-24
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多