我正在尝试动态构建 SQL 语句,这是结果的一种变体。
sqlQuery {
name: 'fetch-products',
text: 'select * from products where category =
$1 and designer in $2',
values: [ 'WOMENSCLOTHING', "('Adjavon', 'ALC', 'Adele', 'Bagley')" ]
}
我使用以下代码段构建sql:
const {
category,
designers,
} = JSON.parse(filters);
let values = [category];
let text = 'select * from products where category = $1';
if(designers) {
text = text + ' and designer in $2';
values.push(designers);
}
我在下面的段中执行它:
try {
const allProducts = await pool.query(sqlQuery);
res.status(200).json(allProducts.rows);
} catch (error) {
console.error(error);
return res.status(500).send('Problems getting products by category.')
}
并得到以下错误:
错误:“$2”处或附近有语法错误
我认为错误可能是设计器被推到值数组上时放置在设计器周围的双引号:
values: [ 'WOMENSCLOTHING', "('Adjavon', 'ALC', 'Adele', 'Bagley')" ]
我不知道你到底在使用哪个库,但是
values
属性看起来非常可疑。
sqlQuery {
name: 'fetch-products',
text: 'select * from products where category =
$1 and designer in $2',
values: [ 'WOMENSCLOTHING', "('Adjavon', 'ALC', 'Adele', 'Bagley')" ]
}
如果您的驱动程序/库支持此功能,则数组中的第二个元素应该是实际数组,而不是像
'("foo", "bat")'
这样的字符串。驱动程序如何知道这是一个列表而不是具有该值的单个字符串?
我想简而言之,您必须以这种形式提出查询:
const query = 'select * from products where category = $1 and designer in ($2, $3, $4, $5)'
const values = [ 'WOMENSCLOTHING', 'Adjavon', 'ALC', 'Adele', 'Bagley' ]
这需要在后端进行一些额外的工作来映射值并将它们调整为正确的形状。
我想你可以通过这样的事情来完成:
const category = 'icecream'
const designers = ['jim', 'maria']
let values = [category];
let text = 'select * from products where category = $1';
if (designers) {
text += ` and designer in (${designers.map((d, i) => `$${i+2}`).join(', ')})`;
values = [...values, ...designers];
}
console.log(text);
console.log(values);