如何使用sequelize和mysql在json列的select上使用lower?

qlfbtfca  于 2021-06-24  发布在  Mysql
关注(0)|答案(1)|浏览(354)

我不确定我是否需要去原始的,但我希望不是。
我有这样的代码:

let where = {
  "foo": "bar"
}

然后,我循环遍历可能从查询param发送的键,这些键需要在json数据类型中进行搜索。

const string_json_keys = ['title', 'description'];
let jsonHits = [];
string_json_keys.forEach(key => {
  if (params[key]) {
    let functionalWhere = sequelizeInstance.where(sequelizeInstance.fn('lower', sequelizeInstance.col(`metadata->$.${key}`)), params[key].toLowerCase());
    jsonHits.push(functionalWhere);

  }
});

if (jsonHits.length) {
  where[Op.and] = jsonHits;
}

给一个头衔 Hello World 我想将搜索规范化为所有小写,因为json在mysql中是区分大小写的。意思是我想说 WHERE LOWER(title) = hello world .
以上代码转换为

WHERE (lower(`metadata->$`.`title`) =

我不知道怎么把它改成一串 metadata->$.title 根据需要。我试着逃走 .\. 但是没有运气。

pdsfdshx

pdsfdshx1#

-> 是的缩写 JSON_EXTRACT . 我需要用那个方法,然后再降低,得到我想要的。使用 JSON_UNQUOTE 这样我就可以将用户输入字符串与实际字符串进行比较,而不是 "hello world" . 用户不会使用引号进行搜索,因此不会返回任何内容。

let extractCall = sequelizeInstance.fn('JSON_EXTRACT', sequelizeInstance.col('metadata'), `$.${key}`);
let unquoteCall = sequelizeInstance.fn('JSON_UNQUOTE', extractCall);
let functionalWhere = sequelizeInstance.where(sequelizeInstance.fn('LOWER', unquoteCall), params[key].toLowerCase());

我还提出了一个允许速记的问题https://github.com/sequelize/sequelize/issues/9332. 这将使代码更干净一些。
我还应该注意 JSON_UNQUOTE 从技术上讲,我不需要满足我的问题,我的能力,以正确使用 LOWER ,但我认为人们通常需要搜索字符串值和实际的json对象。

相关问题