Параметризация `LIMIT ALL` в pg-обещании - PullRequest
1 голос
/ 20 марта 2020

У меня есть этот простой запрос:

SELECT * FROM table ORDER BY ${pageSortKey:name} ${pageSortDir:raw} LIMIT ${pageLimit} OFFSET ${pageOffset}

Как мне передать ALL для LIMIT?

Насколько я понимаю - ${pageLimit} трактуется как int, и, таким образом, если я пытаюсь передать ему аргумент 'ALL', я получаю:

"неверный синтаксис ввода для типа bigint: \" ALL \ ""

Очень ценится за чтение.

1 Ответ

1 голос
/ 20 марта 2020

Самое простое - заставить его использовать значение напрямую, изменив переменную на ${pageLimit:raw}.

Более безопасный подход - создать собственный настраиваемый тип для него, используя Форматирование настраиваемого типа :

const limit = val => ({rawType: true, toPostgres: () => val ?? 'ALL'});

Затем передать результат функции в качестве значения в запрос, который выдаст:

  • limit(0) => 0
  • limit(123) => 123
  • limit() => ALL
  • limit(null) => ALL

Второй подход лучше, но обычно вы можете заключить в него всю LIMIT logi c, а не только предельное значение:

const limit = val => ({ rawType: true, toPostgres: () => val ? `LIMIT ${val}` : '' });

Чтобы создать все предложение LIMIT только при наличии фактический предел, который будет применяться:

  • limit(0) => ``
  • limit() => ``
  • limit(null) => ``
  • limit(123) => LIMIT 123

примеры:

db.any('SELECT * FROM table $1', [limit(123)]);
//=> SELECT * FROM table LIMIT 123

db.any('SELECT * FROM table ${limit}', {limit: limit(123)});
//=> SELECT * FROM table LIMIT 123
...