Вложенные условные выражения в PostgreSQL, синтаксическая ошибка? - PullRequest
1 голос
/ 13 апреля 2020

Я использую PostgreSQL, и я хотел бы объединить эти два случая, но когда я раскомментирую код, я получаю синтаксическую ошибку. Это не сложная инструкция. Я хочу разделить или умножить полученное число в зависимости от условия. Как я могу ввести его, чтобы код был скомпилирован?

SELECT
SUM(

CASE
    WHEN transactions.recipient_account_bill_id = recipientBill.id AND recipientBill.user_id = 2
    THEN 1
    ELSE -1
END * transactions.amount_money

/* CASE
    WHEN senderBillCurrency.id = recipientBillCurrency.id
    THEN NULL
    ELSE
        CASE
            WHEN recipientBillCurrency.base = true
            THEN /
            ELSE *
        END senderBillCurrency.current_exchange_rate
END */

) as TOTAL

FROM transactions

LEFT JOIN bills AS senderBill ON senderBill.id = transactions.sender_account_bill_id
LEFT JOIN bills AS recipientBill ON recipientBill.id = transactions.recipient_account_bill_id
LEFT JOIN currency as senderBillCurrency ON senderBillCurrency.id = senderBill.currency_id
LEFT JOIN currency as recipientBillCurrency ON recipientBillCurrency.id = recipientBill.currency_id

WHERE 2 IN (senderBill.id, recipientBill.id)

1 Ответ

3 голосов
/ 13 апреля 2020

Вы не можете создавать такие динамические выражения c SQL. Выражение CASE не может вернуть оператор, как если бы SQL был неким языком макросов. Вы можете только вернуть выражение.

Вы уже использовали следующий подход, используя 1 и -1 с умножением. Почему бы также не использовать его с N и 1/N:

<some expression> * CASE WHEN condition THEN 1 / N ELSE N END

Или в вашем случае:

<some expression> * CASE
    WHEN senderBillCurrency.id = recipientBillCurrency.id THEN 1
    WHEN recipientBillCurrency.base THEN 1 / senderBillCurrency.current_exchange_rate
    ELSE senderBillCurrency.current_exchange_rate
END

Обратите внимание, вы можете поместить несколько предложений WHEN в CASE выражение. Не нужно их вкладывать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...