在 pg-promise 中参数化 `LIMIT ALL`

Parameterising `LIMIT ALL` in pg-promise

我有这个简单的查询:

SELECT * FROM table ORDER BY ${pageSortKey:name} ${pageSortDir:raw} LIMIT ${pageLimit} OFFSET ${pageOffset}

如何将 ALL 传递给 LIMIT

据我了解 - ${pageLimit} 被视为 int,因此如果我尝试将参数 'ALL' 传递给它,我得到:

"invalid input syntax for type bigint: \"全部\""

非常感谢阅读。

最简单的就是让它直接使用值,方法是将变量更改为${pageLimit:raw}

一种更安全的方法是使用 Custom Type Formatting:

创建您自己的自定义类型
const limit = val => ({rawType: true, toPostgres: () => val ?? 'ALL'});

然后将函数结果作为值传递给查询,这将产生:

  • limit(0) => 0
  • limit(123) => 123
  • limit() => ALL
  • limit(null) => ALL

第二种方法更好,但通常,您会选择将整个 LIMIT 逻辑包装到其中,而不仅仅是限制值:

const limit = val => ({ rawType: true, toPostgres: () => val ? `LIMIT ${val}` : '' });

仅当存在实际限制时才生成整个 LIMIT 子句:

  • limit(0) =>``
  • limit()=>``
  • limit(null)=>``
  • limit(123) => LIMIT 123

例子:

db.any('SELECT * FROM table ', [limit(123)]);
//=> SELECT * FROM table LIMIT 123

db.any('SELECT * FROM table ${limit}', {limit: limit(123)});
//=> SELECT * FROM table LIMIT 123