我有postgres与JSONB数据类型即两列。 'category'和'subcategory'。我需要根据用户的输入来搜索这些列。 JSON在“类别”一栏的样子:
[{id: 36, name: "categoryName1"},{id: 42, name: "categoryName2"}]
和JSON在“子类别”栏的样子:
[{id: 52, name: "subCategoryName1"},{id: 56, name: "subCategoryName2"}, {id: 70, name: "subCategoryName1"}]
输入可以是“ID”,也可以是一个“name'.The查询我写了尽可能远的尝试在每个提供的输入列中找到完全相同的名称。但我想让用户甚至可以通过部分名称查找,所以试图使用$ilike
运算符。查询如下:
Model.findAll({
where: {
$or: {
category: {
$contains: [{
"name": {
$ilike: '%' + term + '%'
}
}]
},
subcategory: {
$contains: [{
"name": {
'$ilike': '%' + term + '%'
}
}]
}
}
}
})
原始查询:
SELECT "category", "subcategory" FROM "table" AS "table"
WHERE "table"."category" @> '[{"name":{"$ilike":"%subCategoryName2%"}}]'
OR "table"."subcategory" @> '[{"name":{"$ilike":"%subCategoryName2%"}}]'
为什么ILIKE!?我认为你应该使用$不需要扣款 – farhadamjady
我想让搜索大小写不敏感。我尝试了'$ ilike',但没有引用。 – Leo
1)[运营商](http://docs.sequelizejs.com/en/latest/docs/querying/)是'$ iLike'(注意大写'L')2)你可能不能混合$包含“与其他任何东西。 PostgreSQL没有任何简单的操作符来做到这一点。在SQL层面上,你可以通过'('LATERAL')JOIN'jsonb_array_elements()'](http://stackoverflow.com/search?q=%5Bpostgresql%5D+like+json+array),但我怀疑这种续集会隐含地为你做到这一点。 – pozs