#knex.js
#knex.js
Вопрос:
Я хочу переписать следующий запрос, чтобы использовать knex query builder. Я не уверен, как это сделать, учитывая, что я использую вложенные запросы и unnest
функцию.
SELECT * FROM (
SELECT DISTINCT ON (id) *
FROM (
SELECT unnest(other_titles) aliases, *
FROM book
) b
WHERE (b.aliases like 'Harry Potter%' OR b.book_title ILIKE 'Harry Potter%' OR b.metadata ILIKE 'Harry Potter%')
) t
ORDER BY book_title
LIMIT 50;
Ответ №1:
https://runkit.com/embed/vefz65n26yer
const Knex = require('knex');
const knex = Knex({
client: 'pg',
});
const inner2 = knex('book').select(knex.raw('unnest(??) aliases', ['other_titles']), '*').as('b');
const inner1 = knex(inner2).select(knex.raw('distinct on (??) *', ['id']))
.where(builder => {
builder.where('b.aliases', 'like', 'Harry Potter%')
.orWhere('b.book_title', 'ilike', 'Harry Potter%')
.orWhere('b.metadata', 'ilike', 'Harry Potter%');
}).as('t');
knex(inner1).orderBy('book_title').limit(50).toSQL()
Выводит:
select *
from (
select distinct on ("id") *
from (
select unnest("other_titles") aliases, *
from "book"
) as "b"
where (
"b"."aliases" like ? or
"b"."book_title" ilike ? or
"b"."metadata" ilike ?
)
) as "t"
order by "book_title" asc limit ?