【问题标题】:How can I use LOWER on SELECT of JSON column using Sequelize and MySQL?如何使用 Sequelize 和 MySQL 在 JSON 列的 SELECT 上使用 LOWER?
【发布时间】:2018-04-20 23:05:03
【问题描述】:

我不确定我是否需要为此进行原始查询,但我希望不需要。

我有这样的代码:

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

然后我遍历可能从查询参数发送的键,这需要在 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。我尝试用\. 转义.,但没有运气。

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    ->JSON_EXTRACT 的简写。我需要使用该方法,然后使用 LOWER 来获得我想要的东西。使用JSON_UNQUOTE 这样我就可以将我的用户输入字符串与实际字符串进行比较,而不是"hello world" 的JSON 对象。用户不会使用引号进行搜索,因此不会返回任何内容。

    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 对象的人们来说,这是一个普遍的需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 2018-09-14
      • 2021-01-11
      • 2015-03-19
      • 1970-01-01
      • 2018-07-26
      • 2019-07-15
      • 2015-09-05
      相关资源
      最近更新 更多