mysql - Mysql:使用“OR”匹配的字段
问题描述
我有这个查询:
SELECT * FROM accounts WHERE username = "aaa" OR email = "abc@example.com" OR mobile = "123456789"
我可以像这样找到哪个字段匹配:
var username = req.body.username;
var email = req.body.email;
var mobile = req.body.mobile;
database.query("SELECT * FROM accounts WHERE username = ? OR email = ? OR mobile = ?",[username, email, mobile, (err, result)=>{
if (result.username == username) {...}
if (result.email == email) {...}
if (result.mobile == mobile) {...}
}
但是,我想知道哪个字段匹配而不使用if
多次(如果可能的话)。那么,这种可能的形式仅在 Mysql 中吗?
解决方案
你可以把它放在SELECT
列表中。您可以使用CONCAT_WS()
将列列表组合成一个逗号分隔的列表。它会省略NULL
值,所以这只会列出匹配的字段。
database.query(`SELECT *,
CONCAT_WS(',',
IF(username = ?, 'username', NULL),
IF(email = ?, 'email', NULL),
IF(mobile = ?, 'mobile', NULL)) AS matched_fields
FROM accounts WHERE username = ? OR email = ? OR mobile = ?`, [username, email, mobile, username, email, mobile], (err, result) => {
var matched = result.matched_fields.split(',');
matched.each(field => {
switch(field) {
case 'username': ...; break;
case 'email': ...; break;
case 'mobile': ...; break;
});
})
推荐阅读
- node.js - Sequelize Typescript:类型“FavoriteEntity []”不可分配给类型“FavoriteEntity | 无效的'
- jsf - 从 JSF 控制器获取数据到 EJB
- android - 设备屏幕锁定时未调用 Firebase onDataChange
- json - JSON unmarshal in nested struct
- java - 使用 SWIG 在 c++ 和 java 之间创建接受 std::vector(映射到 ByteBuffer)的 std::function
- c# - TechTalk.SpecFlow 错误
- entity-framework - 确保实体框架迁移顺序
- javascript - ReactJS async rendering
- orientdb - PyOrient 客户端在尝试连接服务器时报告协议版本错误
- javascript - How To get the Previous selected State of an Element?