Я пытаюсь обновить столбец таблицы, который зависит еще от одной таблицы. Запрос sql работает нормально в базе данных и не смог определить запрос микро-ормы для этого. Ниже приведены запросы sql и mikro-orm, которые я пробовал. Микро-орм не принимает запросы на обновление как необработанные запросы. Может ли кто-нибудь мне помочь или хотя бы помочь мне в этом?
UPDATE schema.control_subs AS s
SET cancel_date = CASE
WHEN :input_date < c.start_date THEN c.start_date
ELSE :input_date
END
FROM schema.controls AS c
WHERE s.control_id = c._id
AND s.control_id IN (:controlIds);
await this.em
.createQueryBuilder(ControlSubs)
.update({
cancel_date: this.em
.createQueryBuilder(Controls, "c")
.select(
// raw(`CASE WHEN ${cancelDate} < c.start_date THEN c.start_date ELSE ${cancelDate} END`)
raw(
`CASE WHEN
TIMESTAMP ${cancelDate
.toISOString()} AT TIME ZONE 'UTC' < c.start_date
THEN c.start_date
ELSE TIMESTAMP ${cancelDate.toISOString()} AT TIME ZONE 'UTC' END`,
),
)
.where("c._id = s.control_id"),
})
.where({
s.control_id: { $in: controlIds },
});
Я пробовал это Как добавить выражение CASE в построитель запросов mikro-orm? но выражение сейчас недоступно.
🤔 А знаете ли вы, что...
Node.js - это среда выполнения JavaScript, разработанная на основе JavaScript V8 движка, созданного Google.
Я изменил запрос таким образом, чтобы часть обновления брала даты в зависимости от условий и объединяла таблицы с помощью .join()
. Вот обновленный запрос.
await this.em
.createQueryBuilder(ControlSubs, 'cs')
.update({
cancel_date: raw(
`
CASE
WHEN ? < ( SELECT start_date FROM schema.controls WHERE _id = cs.control_id)
THEN (SELECT start_date FROM schema.controls WHERE _id = cs.control_id)
ELSE ?
END
`,
[cancelDate, cancelDate],
),
}).join('cs.control_id', 'c')
.where({
s.control_id: { $in: controlIds },
});
Было бы здорово, если бы кто-нибудь рассмотрел его и дал какие-либо предложения по его улучшению.