Postgres / Sequelize - условно добавить предложение в запрос - PullRequest
0 голосов
/ 23 января 2020

У меня есть таблица, в которой есть несколько записей. Я должен фильтровать эти записи между 2 датами или после / до заданной даты, или вообще не фильтровать, если даты не пройдены. Даты идут по полезной нагрузке маршрута сервера. Запрос выглядит примерно так:

select * from table where "id"=4 and (s2."createdAt" >= date("createdAt") and s2."createdAt" <= date("createdAt"))

Здесь может быть задано либо первое createdAt, либо второе, либо его вообще нет, в случае чего запрос не будет иметь предложение и будет завершено в "id"=4. Я использую sequelize для написания необработанного запроса и JavaScript / NodeJS для реализации. Вот код:

query = await sequelize.query(`select * from "Stores" s2 where "Id" = ${user.id} and (s2."createdAt" >='${param.fromDate}' and s2."createdAt <='${param.toDate}') group by date("createdAt")`);

В настоящее время я пишу 4 разных дела if / else с 4 разными запросами в зависимости от наличия даты. Как получить динамический c, определив только один запрос и добавив даты, если они доступны?

1 Ответ

0 голосов
/ 23 января 2020

Вы можете сделать:

where 
    id = :user.id
    and (:param_from_date is null or s2."createdAt" >= :param_from_date)
    and (:param_to_date is null   or s2."createdAt" <= :param_to_date)

Это можно сократить как:

where 
    id = :user_id
    and s2."createdAt" >= coalesce(:param_from_date, s2."createdAt")
    and s2."createdAt" <= coalesce(:param_to_date, s2."createdAt")

Обратите внимание, что в этих выражениях используются параметры запроса вместо значений в строке запроса. Вы хотите использовать параметризованный запрос для защиты ваших запросов от повторов SQL и повышения их эффективности.

...