Sequelize:WHERE LIKE 子句中的 Concat 字段
Sequelize: Concat fields in WHERE LIKE clause
我正在为我正在处理的 node.js 项目使用 sequelize ORM。我有一个查询,我需要对多列的串联结果执行类似的操作。
例如,如下所示:
SELECT * FROM People WHERE (CONCAT(firstname, ' ', lastname)) LIKE '%John Do%'.
我正在使用以下语法,想知道这是否可行而不必求助于使用 RAW 查询(我的解决方案中没有其他地方)。
var criteria = {
include: [
occupation
],
where: {
is_active: 1
},
nest: false
};
db.people.findAll(criteria, {}).then(function(people) {
success(people);
}).catch(function(err) {
error(err);
});
有什么想法吗?
你需要这样的东西
var criteria = {
where: Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstname"), Sequelize.col("lastname")), {
like: '%John Do%'
})
}
注意:未测试
受@code-jaff 启发,但您需要在名字和姓氏之间连接一个 space 字符串才能使其正常工作。否则它只会 return 用于 'JohnDoe' 而不是 'John Doe'。这是代码。
Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
like: '% John Doe %'
})
为了向可能不了解这适合您的查询的人提供一些上下文,这是 where 或语句中上述代码的示例。 req.body.query 是您要发布的变量搜索词。
Users.findAll({
where: {
$or: [
Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
like: '%' + req.body.query + '%'
}),
{ email: { $like: '%' + req.body.query + '%' } },
{ companyName: { $like: '%' + req.body.query + '%' } }
]
}
})
Sequelize 4.0 更新
基于字符串的运算符(上例中的 $like
和 $or
)已被弃用,取而代之的是基于符号的运算符。这对安全来说是件好事
参见:http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
这些运算符将替换为 [Sequelize.Op.like]
和 [Sequelize.Op.or]
。还有其他方法可以在他们的文档中突出显示的续集选项中配置它
我能够使用基于@yjimk 回答的新续集版本 5.21.13 实现这一点。
Users.findAll({
where: {
[sequelize.Op.or]:{
namesQuery: sequelize.where(
sequelize.fn(
"concat",
sequelize.col("firstName"),
" ",
sequelize.col("lastName")
),
{
[sequelize.Op.like]: `%${req.body.query}%`,
}
),
email: {[sequelize.Op.like]: `%${req.body.query}%`},
companyName: {[sequelize.Op.like]: `%${req.body.query}%`},
}
})
db.models.users.findOne({
where: {
[db.sequelize.Op.and]: [
db.sequelize.where(
db.sequelize.fn('CONCAT', db.sequelize.col('first_name'), ' ', db.sequelize.col('last_name')),
{ like: `%${name}%` },
),
{ status: 'ACTIVE' },
]
}
});
我正在为我正在处理的 node.js 项目使用 sequelize ORM。我有一个查询,我需要对多列的串联结果执行类似的操作。
例如,如下所示:
SELECT * FROM People WHERE (CONCAT(firstname, ' ', lastname)) LIKE '%John Do%'.
我正在使用以下语法,想知道这是否可行而不必求助于使用 RAW 查询(我的解决方案中没有其他地方)。
var criteria = {
include: [
occupation
],
where: {
is_active: 1
},
nest: false
};
db.people.findAll(criteria, {}).then(function(people) {
success(people);
}).catch(function(err) {
error(err);
});
有什么想法吗?
你需要这样的东西
var criteria = {
where: Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstname"), Sequelize.col("lastname")), {
like: '%John Do%'
})
}
注意:未测试
受@code-jaff 启发,但您需要在名字和姓氏之间连接一个 space 字符串才能使其正常工作。否则它只会 return 用于 'JohnDoe' 而不是 'John Doe'。这是代码。
Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
like: '% John Doe %'
})
为了向可能不了解这适合您的查询的人提供一些上下文,这是 where 或语句中上述代码的示例。 req.body.query 是您要发布的变量搜索词。
Users.findAll({
where: {
$or: [
Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
like: '%' + req.body.query + '%'
}),
{ email: { $like: '%' + req.body.query + '%' } },
{ companyName: { $like: '%' + req.body.query + '%' } }
]
}
})
Sequelize 4.0 更新
基于字符串的运算符(上例中的 $like
和 $or
)已被弃用,取而代之的是基于符号的运算符。这对安全来说是件好事
参见:http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
这些运算符将替换为 [Sequelize.Op.like]
和 [Sequelize.Op.or]
。还有其他方法可以在他们的文档中突出显示的续集选项中配置它
我能够使用基于@yjimk 回答的新续集版本 5.21.13 实现这一点。
Users.findAll({
where: {
[sequelize.Op.or]:{
namesQuery: sequelize.where(
sequelize.fn(
"concat",
sequelize.col("firstName"),
" ",
sequelize.col("lastName")
),
{
[sequelize.Op.like]: `%${req.body.query}%`,
}
),
email: {[sequelize.Op.like]: `%${req.body.query}%`},
companyName: {[sequelize.Op.like]: `%${req.body.query}%`},
}
})
db.models.users.findOne({
where: {
[db.sequelize.Op.and]: [
db.sequelize.where(
db.sequelize.fn('CONCAT', db.sequelize.col('first_name'), ' ', db.sequelize.col('last_name')),
{ like: `%${name}%` },
),
{ status: 'ACTIVE' },
]
}
});