Я хочу знать, как деструктурировать переменную массива в необработанном запросе TypeORM или POSTGRESQL.
У меня такой запрос:
getConnection()
.query(`SELECT m.col1, m.col2, m.col3, t.col1, c.col1
FROM schema.msomething m
LEFT JOIN schema.csomething c ON m.col1 = c.col1
LEFT JOIN schema.tsomething t ON m.col1 = t.col1
WHERE ((m.start_date, m.end_date) OVERLAPS ($1, $2))
AND (c.col1 IN ('valueA', 'valueB', 'valueC'))`,
[
start_date,
end_date
]
);
Этот запрос работает нормально, как и ожидалось, но я хочу, чтобы ('valueA', 'valueB', 'valueC') стал динамическим значением, присвоенным $3, которое будет Множество,
Я пробовал следующее:
AND (c.col1 IN (...$3))
или
AND (c.col1 IN $3)
... но ни один из них не работает.
Мне нужно использовать необработанный запрос, так как я использую здесь OVERLAPS, использование :var не работает в .query()
Но разве в этом случае where('... overlaps (:start, :end)', { start: start_date, end: end_date }) не сработает? Я не думаю, что ORM действительно понимает SQL, он, вероятно, просто выполняет какие-то споры о строках в сочетании с проверкой типов и экранированием. В противном случае вам пришлось бы создать нужное количество пронумерованных заполнителей, а затем разбить массив, чтобы предоставить значения для этих заполнителей.





Возможно, немного поздно, но я бы сделал так:
...
`c.col1 = ANY(string_to_array($3,$4))`,
[
start, end,
[1,2,3].join(SEP), SEP
]
...
Конечно, вы должны быть уверены, что ваша строка SEP не находится ни в одном элементе вашего массива [1,2,3].
Вы должны иметь возможность использовать именованные заполнители и сказать
c.col1 in (:...vals)и{ vals: ['valueA', 'valueB', 'valueC'] }(github.com/typeorm/typeorm/issues/1239#issuecomment-3669556 28), а не нумерованные заполнители в стиле PostgreSQL.