当前位置: 首页 > 知识库问答 >
问题:

使用准备好的语句在PostgreSQL上使用SQL:2008标准限制结果

段曦
2023-03-14
SELECT pc.id AS pc_id, p.id AS p_id  
FROM post_comment pc 
INNER JOIN post p ON p.id = pc.post_id 
ORDER BY pc.id 
OFFSET ? ROWS 
FETCH FIRST ? ROWS ONLY;
SELECT pc.id AS pc_id, p.id AS p_id  
FROM post_comment pc 
INNER JOIN post p ON p.id = pc.post_id 
ORDER BY pc.id 
OFFSET ? ROWS 
FETCH FIRST (?) ROWS ONLY;

这是一个bug还是只是一个实现细节?

该测试可在GitHub上获得

共有1个答案

艾星河
2023-03-14

执行细节。

这不是JDBC驱动程序的问题,而是数据库级别的问题。

test=> SELECT 1 OFFSET 1 ROWS FETCH FIRST 1 ROWS ONLY;
 ?column? 
----------
(0 rows)

test=> PREPARE stmt(integer, integer) AS SELECT 1 OFFSET $1 ROWS FETCH FIRST $2 ROWS ONLY;
ERROR:  syntax error at or near "$2"
LINE 1: ..., integer) AS SELECT 1 OFFSET $1 ROWS FETCH FIRST $2 ROWS ON...

问题是只获取前n行的参数没有被解析为可供参数放置的文本。

          /* SQL:2008 syntax */
          | FETCH first_or_next opt_select_fetch_first_value row_or_rows ONLY
              { $$ = $3; }
  /*                          
   * Allowing full expressions without parentheses causes various parsing
   * problems with the trailing ROW/ROWS key words.  SQL only calls for
   * constants, so we allow the rest only with parentheses.  If omitted,
   * default to 1.
   */
  opt_select_fetch_first_value:
              SignedIconst                        { $$ = makeIntConst($1, @1); }
              | '(' a_expr ')'                    { $$ = $2; }
              | /*EMPTY*/                         { $$ = makeIntConst(1, -1); }
          ;
 类似资料:
  • 我有一个将列名映射到值的。要更新的列事先未知,在运行时决定。 例如< code>map = {col1: "value1 ",col2: "value2"}。 我想执行一个< code>UPDATE查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,有没有一种优雅的方法可以不用手动构建查询?

  • 问题内容: 在mysqli准备好的语句中,NULL变成’‘(对于字符串)或0(对于整数)。我想将其存储为真正的NULL。有什么办法吗? 问题答案: 我知道这是一个旧线程,但是可以将真实的NULL值绑定到准备好的语句(请阅读this)。 实际上,您可以使用mysqli_bind_parameter将NULL值传递给数据库。只需创建一个变量并将NULL值(请参见手册页)存储到该变量并将其绑定即可。无论

  • 问题内容: 我已经使用prepared语句将订单插入到订单表中,但是现在我想根据订单表中插入的最后一个ID将订单项插入到订单表中: 等同于使用准备好的语句? 问题答案: 如果您使用的是PDO,则为。因此,如果您的数据库句柄称为: 如果您使用的是MySQLi,则为或:

  • 我将游标声明放在准备好的语句中,然后执行它,然后返回一个

  • 问题内容: 我有一个使用准备好的语句的Doctrine_RawSql查询。但是,当生成SQL查询时,它们似乎会被忽略。但是,如果我忽略了标记值,则会得到关于不匹配的绑定变量数量的异常(因此,至少是试图将它们包含在内)。 如果我内联包含这些值,Doctrine是否在幕后做任何事情以防止SQL注入? 这是我的代码: 这提供了以下SQL输出: 编辑:上的属性已正确设置。如果我对参数进行硬编码: 我遇到了