为什么我的动态 sql 会导致如下所示的错误?

Why is my dynamic sql resulting in the error shown below?

我正在尝试动态构建 sql 语句,这是结果的一种变体。

sqlQuery {
  name: 'fetch-products',
  text: 'select * from products where category = 
   and designer in ',
  values: [ 'WOMENSCLOTHING', "('Adjavon', 'ALC', 'Adele', 'Bagley')" ]
}

我使用以下代码段构建 sql:

const {
    category,
    designers,
} = JSON.parse(filters);

let values = [category];

let text = 'select * from products where category = ';

if(designers) {
    text = text + ' and designer in ';
    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 gettting products by category.')
}

并得到以下错误:

error: syntax error at or near ""

我认为错误可能是在将设计器推送到值数组时将其放在双引号周围:

values: [ 'WOMENSCLOTHING', "('Adjavon', 'ALC', 'Adele', 'Bagley')" ]

我不知道你用的是什么库,但是 values 属性 看起来很可疑。

sqlQuery {
  name: 'fetch-products',
  text: 'select * from products where category = 
   and designer in ',
  values: [ 'WOMENSCLOTHING', "('Adjavon', 'ALC', 'Adele', 'Bagley')" ]
}

如果您的 drivr/library 支持这个,数组中的第二个元素应该是一个实际的数组,而不是像 '("foo", "bat")' 这样的字符串。驱动程序如何知道这是一个列表而不是具有此值的单个字符串?

我想简而言之,您必须以这种形式进行查询:

const query = 'select * from products where category =  and designer in (, , , )'

const values =  [ 'WOMENSCLOTHING', 'Adjavon', 'ALC', 'Adele', 'Bagley' ]

这需要在后端进行一些额外的工作来映射值并将它们调整为正确的形状。

我想你可以用这样的方法来完成:

const category = 'icecream'
const designers = ['jim', 'maria']

let values = [category];

let text = 'select * from products where category = ';

if (designers) {
  text += ` and designer in (${designers.map((d, i) => `$${i+2}`).join(', ')})`;
  values = [...values, ...designers];
}

console.log(text);
console.log(values);