sequelize op.or order by exact match first按完全匹配排序

roqulrg3  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(455)

我有一个机场表,每行包含以下字段:国际航空运输协会,城市,国家。。。如何搜索所有这些字段,但首先返回完全匹配的结果?例如,如果我键入alb,我想看到的第一个结果是alb,奥尔巴尼,美国,然后所有其他比赛,而不是tia,地拉那,阿尔巴尼亚和奥尔巴尼之后?
这是我的密码:

const airports = await Airport.findAll({
      attributes: [
        'IATA',
        'city',
        'country',
      ],
      where: {
        [sequelize.Op.or]: [
          { IATA: filter.toUpperCase() },
          { city: { [sequelize.Op.like]: `%${filter}%` } },
          { country: { [sequelize.Op.like]: `%${filter}%` } },
        ],
        status: 1,
      },
});
t30tvxxf

t30tvxxf1#

我用这种方法解决了一个相关的问题。我在上创建了一个专栏 order 如果与上的完全匹配,则返回1 IATA 像其他人一样 2 . 订购此专栏将解决您的问题。
因为你的专栏可能会有所不同 literal() ,可以修改order属性,但概念是这样的。

const airports = await Airport.findAll({
      attributes: [
        'IATA',
        'city',
        'country',
      ],
      where: {
        [sequelize.Op.or]: [
          { IATA: filter.toUpperCase() },
          { city: { [sequelize.Op.like]: `%${filter}%` } },
          { country: { [sequelize.Op.like]: `%${filter}%` } },
        ],
        status: 1,
      },
      order: {
         [
           sequelize.literal('CASE WHEN `IATA` like '%${filter}%' THEN 1 ELSE 2 END',
           'desc'
         ],
         ['city', 'desc']
      }
});

按我的目的,我得到了4分 CASE 他很聪明,工作也很好。
obs:如果你的模特有 alias 在列上 IATA ,在这里,您需要输入您的原始列名,因为我们构建了一个文本术语。

相关问题