Как в зависимости от условия производить сортировку, используя данные одного или же другого поля?

Допустим существует модель Product:

model Product {
    @@map(name: "products")
    id              Int         @id @default(autoincrement())
    createdAt       DateTime    @default(now())
    updatedAt       DateTime    @updatedAt
    name            String      @db.VarChar(255) @unique
    price           Int
    discountPrice   Int?
    discountBool    Boolean     @default(false)
}

Среди полей имеются:

  • name - наименование товара;
  • price - цена на товар;
  • discountPrice - более низкая цена на товар, отображается на товаре, если он продается со скидкой;
  • discountBool - определяет будет ли продаваться товар по скидке.

Соответственно сортировка у меня выглядит пока только так:

const products = await Product.findMany({
    orderBy: [
        {
            price: 'asc'
        },
        {
            name: 'asc'
        },
    ]
})

То есть на данный момент товары сортируются только по цене или по имени, если цены совпали. Но нужно, чтобы при сортировке товаров по ценам еще учитывалось установлена ли скидка на товар (discountBool == true). И если на товар включена скидка, то конкретно этот товар сортировать, используя данные из discountPrice, вместо price.

В случае, если Prisma не имеет встроенных способов решить данную задачу, то как тогда хотя бы сделать это в Prisma, но с использованием PostgreSQL?


Ответы (1 шт):

Автор решения: SoftHardcore

Благодарю вас за предоставленный код запроса и за идею поискать у Prisma метод, позволяющий выполнить внутри SQL. В документации описывается такой способ.

const products = await prisma.$queryRaw
`
    SELECT *
    FROM products
    ORDER BY
        CASE
            WHEN "discountBool" THEN "discountPrice" ELSE price
        END ASC,
        name ASC;
`

Также, раз уж я затронул NodeJS и PostgreSQL, то здесь в качестве альтернативы можно использовать библиотеку pg.

→ Ссылка