首页 > 解决方案 > 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 中吗?

标签: mysqlsqlnode.js

解决方案


你可以把它放在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;
  });
})

推荐阅读