Knex + Postgresql + узел - как вызвать функции postgresql для выбранных столбцов - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу проверить, существует ли запись в postgresql или нет, и нужно указать логическое значение.

ПРИМЕЧАНИЕ: Я знаю, что есть простые способы проверки if else, но мне нужно представление в knex для запроса, который я перечислил. Я также знаю, что это сложно, но просто хочу учиться.

Я знаю запрос, Вы можете увидеть здесь ниже,

select exists(select 1 from test where id = XYZ);

Как мне написать этот запрос postgresql с помощью knex?

Я пробовал этот способ, но он не работает.

knex.raw(`SELECT exists(${knex(TABLE_NAME).where(CONDITIONS).select('1').toString()})`)

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вам не нужно выполнять логическое преобразование на стороне БД (разницы в производительности не будет):

knex('test').select('id').where('id', 'XYZ').then(results => results.length > 0);

это также работает, если вы действительно предпочитаете select 1 вместо id:

knex('test').select(knex.raw('1')).where('id', 'XYZ').then(results => results.length > 0);

Ответ Тима также хорош и дает более точное описание того, что вы пытались сделать, но это немного сложнее.

0 голосов
/ 30 апреля 2018

Я адаптировал приведенный ниже код из этого полезного поста GitHub Knex :

var inner = knex('test').where('id', 'XYZ').limit(1);
var clause = knex.raw(inner).wrap('exists (', ') as result');
knex('test').select(clause).limit(1).then(...);

Я думаю, что это должно соответствовать следующему коду SQL:

select exists (select * from test where id = 'XYZ' limit 1) as result
from test
limit 1;

Внешний запрос на test является излишним и не нужен, но я не знаю способа, кроме, возможно, необработанного запроса, чтобы не запускать запрос к таблице в Knex. Оператор LIMIT просто означает, что он вернет одно значение.

...