Как правильно написать запросы с нулевым ограничением в pg-обещании? - PullRequest
0 голосов
/ 19 января 2019

При написании запросов Postgres, ограничения обычно пишутся как WHERE a = $(a) или WHERE b IN $(b:csv), если вы знаете, что это список. Однако, если значение равно null, ограничение должно быть записано WHERE x IS NULL. Можно ли получить запрос для автоматического форматирования, если значение равно нулю или нет?

Скажи, что я могу найти строки WHERE c = 1. Если я знаю c это 1, я напишу запрос как

db.oneOrNone(`SELECT * FROM blah WHERE c = $(c), { c })

Но если c окажется null, запрос должен стать ...WHERE c IS NULL.

Можно ли построить общий запрос наподобие WHERE $(c), и он будет автоматически форматироваться в WHERE c = 1, если c равен 1, и WHERE c IS NULL, если c установлен в ноль?

1 Ответ

0 голосов
/ 19 января 2019

Вы можете использовать Пользовательское форматирование типа , чтобы помочь с динамическими запросами:

const valueOrNull = (col, value) => ({
    rawType: true,
    toPostgres: () => {
        if(value === null) {
             return pgp.as.format('$1:name IS NULL', col);
        }
        return pgp.as.format('$1:name = $2', [col, value]);
    }
});

Затем вы можете передать его в качестве значения форматирования:

db.oneOrNone(`SELECT * FROM blah WHERE $/c/`, { c: valueOrNull('col', 123) })
...