Кажется, у меня возникла проблема с передачей массива в мой запрос и использованием условия IN, я могу успешно вернуть результаты, когда вручную добавляю каждый поисковый запрос в запрос
async function getFixtures() {
let response;
try {
response = await pool.query("SELECT * FROM fixtures WHERE league_name IN ('Chinese Super League', 'Iran Pro League', 'English Premier League')");
} catch (e) {
console.error('Error Occurred', e);
}
return response.rows;
}
Когда я пытаюсь передать массив, но не получаю результатов
async function getFixtures(leaguesArray) {
let response;
try {
response = await pool.query("SELECT * FROM fixtures WHERE league_name IN ($1)", [leaguesArray]);
} catch (e) {
console.error('Error Occurred', e);
}
return response.rows;
}
Когда я выхожу из системы, leaguesArray вернется
['Chinese Super League', 'Iran Pro League', 'English Premier League']
Поэтому, когда он передается в запрос, я думаю, что это
[['Chinese Super League', 'Iran Pro League', 'English Premier League']]
Нужно ли мне преобразовать этот исходный массив в строку?
Я явно что-то упускаю, но не знаю, что
Спасибо
Взгляните на следующий GitHub FAQ, я думаю, он нацелен именно на вашу проблему.
Спасибо @RamizWachtler, все отсортировано, = ANY ($1)





Как упоминается в документы. Я считаю, что вы используете два подхода
Подход # 1
async function getFixtures(leaguesArray) {
let response;
try {
response = await pool.query("SELECT * FROM fixtures WHERE league_name = ANY ($1)", [leaguesArray]));
} catch (e) {
console.error('Error Occurred', e);
}
return response.rows;
}
Подход # 2
async function getFixtures(leaguesArray) {
let response;
const offset = 1;
const placeholders = leagueArray.map(function(name,i) {
return '$'+(i+offset);
}).join(',');
try {
response = await pool.query("SELECT * FROM fixtures WHERE league_name IN (" + placeholders+")", leaguesArray));
} catch (e) {
console.error('Error Occurred', e);
}
return response.rows;
}
Подход №2 терпит неудачу, если длина placeholders равна 0. Получение WHERE league_name IN () бросает syntax error at or near ")".
У меня такая же проблема, и я решил ее с помощью пакета pg-формат.
Для WHERE IN вы можете использовать это так:
import format from 'pg-format';
response = await pool.query(format("SELECT * FROM fixtures WHERE league_name IN (%L)", leaguesArray));
Примечание: теперь pool.query принимает только один аргумент, а format принимает шаблон + переменные для генерации допустимого запроса SQL.
Вы уверены, что
("SELECT * FROM fixtures WHERE league_name IN ($1)", [leaguesArray])работает? Я имею в виду - вы уверены, что он заменит $ 1 на этот массив в запросе?