knex.js - knex js中的嵌套查询和unnest函数
问题描述
我想重写以下查询以使用 knex 查询生成器。鉴于我正在使用嵌套查询和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;
解决方案
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 ?
推荐阅读
- c# - SQL 如何替换一个值
- python - 使用 python 和请求,如何进行正确的 POST 调用以及在哪里找到标头?
- android - FirebaseAppDistribution:appDistributionUpload gradle 命令中缺少应用程序 ID
- mysql - 跨列和行计算值的实例
- javascript - 使用 redux 钩子时使用 redux 操作的最佳选择是什么?
- sql - Impala 2.11:AnalysisException:选择列表中不支持子查询
- swift - 在 SwiftUI 中获取当前的经纬度
- c++ - 是否可以禁止一个类被动态转换为?
- git - Git - 将发布分支合并到主分支
- tensorflow - 任何想法如何解决激活函数的问题?