我有一个带有user
jsonb列的data
表。这样,我有一个cars
数组,其中可以包含0-N辆汽车。
我正在尝试执行类似的查询,以查找用户的cars
数组是否包含Toyota或Mitsubishi,但会引发错误
await knex('users.record')
.where('created_at', '>', '2019-05-21')
.select('data')
.whereRaw('cars', ['Toyota', 'Mitsubishi']) // this seems wrong
.returning('*');
一个示例用户的cars
数组是['Toyota', 'Mitsubishi', 'Honda', 'Ford']
答案 0 :(得分:0)
尝试更换
.whereRaw('cars', ['Toyota', 'Mitsubishi']
使用
where('cars', 'like','%Toyota%').orWhere('cars', ,like, '%Mitsubishi%')
答案 1 :(得分:0)
您可以使用jsonb
contains operator @>
:
SELECT * FROM users
WHERE created_at > '2019-05-21'
AND (data @> '{"cars":["Toyota"]}' OR
data @> '{"cars":["Mitsubishi"]}');
纯SQL,我对knex不熟悉。
可以通过索引来支持。参见:
答案 2 :(得分:0)
我认为在Knex中会看起来像这样(带有一些辅助功能以减少重复):
const hasCar = brand => knex.raw(
`?? @> ?::jsonb`,
[
'data',
JSON.stringify({ cars: [ brand ]})
]
)
knex('users.record')
.where(hasCar('Mitsubishi'))
.orWhere(hasCar('Toyota'))