在 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
我有这个简单的查询:
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