在 sequelize where 子句中使用 ILIKE(JSON 列)

Posted

技术标签:

【中文标题】在 sequelize where 子句中使用 ILIKE(JSON 列)【英文标题】:Use ILIKE in sequelize where clause(JSON column) 【发布时间】:2018-07-10 05:52:35 【问题描述】:

我有 JSON 列,其中存储了诸如 -

之类的数据
 tag : ["as","bs","cs"] 

我想使用ILIKE 在此列中搜索,我相信 JSON 数据类型只是字符串,所以我使用了类似的查询 -

SELECT * FROM public."Transactions" WHERE tags::text ILIKE '%as%'

上面的查询在sql中工作正常

我需要用 sequelize 模型实现这个没有成功 代码我用的是

    let searchQuery = [
        
            payee: 
                [Op.iLike]: '%' + search + '%'
            
        ,
        
            tags: 
                [Op.iLike]: '%as%'
            
        
    ];

给出错误

未处理的拒绝 SequelizeDatabaseError: 运算符不存在: json ~~* 未知

【问题讨论】:

【参考方案1】:

https://www.postgresql.org/docs/current/static/functions-json.html

检查运算符列表 - 没有 ~~ - ILIKE 不适用于 json。您必须将 json 转换为文本:

t=# select ' "tag" : ["as","bs","cs"] '::json::text ilike '%as%';
 ?column?
----------
 t
(1 row)

或使用原生运算符:

t=# select (' "tag" : ["as","bs","cs"] '::json)->'tag'->>0 = 'as';
 ?column?
----------
 t
(1 row)

或者如果您是 9.5 及以上版本 - 转换为 jsonb 并使用其强大的运算符:

t=# select ' "tag" : ["as","bs","cs"] '::json::jsonb @> '"tag":["as"]'::jsonb;
 ?column?
----------
 t
(1 row)

https://www.postgresql.org/docs/current/static/functions-json.html

【讨论】:

以上是关于在 sequelize where 子句中使用 ILIKE(JSON 列)的主要内容,如果未能解决你的问题,请参考以下文章

使用 sequelize 包含列的 where 子句

Sequelize - 在 where 子句中查询其他表

Sequelize:WHERE LIKE 子句中的 Concat 字段

在子查询中续集“WHERE”子句

放置在 Sequelize 中的 WHERE 子句中的值,PostgreSQL 以获取所有内容

使用 Node 和 sequelize 关联对象的 Where 子句