Вложенные запросы и функция unnest в knex js

#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 ?