使用 Postgres JSONB“?”构建 knex innerJoin运营商?

问题描述 投票:0回答:1

我想用 knex 创建这样的查询:

select "data"."parent"."name"
from "data"."parent"
         inner join "data"."child" on child_hashes::jsonb ? "data"."child".hash
where "data"."child"."name" = 'Hans'

child_hashes 是一个

JSON
列,用于存储带有子哈希的有序数组。

1.正常查询

knex
            .table(this.parentTableName)
            .innerJoin(this.childTableName, "child_hashes::jsonb", "?", `${this.childTableName}.hash`)
            .where(`${this.childTableName}.name`, name)
            .pluck(`${this.parentTableName}.name`);

这会返回双引号中的“child_hashes::jsonb”

select "data"."parent"."name"
from "data"."parent"
         inner join "data"."child" on "child_hashes::jsonb" ? "data"."child".hash
where "data"."child"."name" = 'Hans'

2.在回调中使用原始查询进行innerJoin

knex
            .table(this.parentTableName)
            .innerJoin(this.childTableName, (query) => {
                query.on(this.knex.raw("layer_hashes::jsonb ? ?.hash", ["?", this.childTableName]));
            })
            .where(`${this.childTableName}.name`, name)
            .pluck(`${this.parentTableName}.name`);

这会返回 ?单引号中的运算符

select "data"."parent"."name"
from "data"."parent"
         inner join "data"."child" on child_hashes::jsonb '?' "data"."child".hash
where "data"."child"."name" = 'Hans'
postgresql jsonb knex.js
1个回答
0
投票

在第二个查询中转义

?
后它就起作用了:

knex
            .table(this.parentTableName)
            .innerJoin(this.childTableName, (query) => {
                query.on(this.knex.raw("layer_hashes::jsonb \\? ??.hash", [this.childTableName]));
            })
            .where(`${this.childTableName}.name`, name)
            .pluck(`${this.parentTableName}.name`);
© www.soinside.com 2019 - 2024. All rights reserved.