使用mutliple WHERE子句

时间:2016-03-02 20:28:08

标签: mysql sql database

我正在构建一个查询来搜索数据库行中几个字段中的关键字,我想知道的是有没有办法返回结果所在的字段。

例如,使用如下查询:

SELECT * 
FROM table
WHERE field1 LIKE "%keyword%" 
   OR field2 LIKE "%keyword%" 
   OR field3 LIKE "%keyword%"

如果关键字显示在field2中,我想返回该行以及标识在field2中找到该行的其他信息。这可能吗?

5 个答案:

答案 0 :(得分:3)

您可以添加一些列以指示哪个字段与where子句匹配。如果不将其放在select

中,则无法提取此信息
SELECT 
    *,
    case when field1 LIKE "%keyword%" then 1 else 0 end as field1_found,
    case when field2 LIKE "%keyword%" then 1 else 0 end as field2_found,
    case when field3 LIKE "%keyword%" then 1 else 0 end as field3_found,
FROM table
WHERE field1 LIKE "%keyword%" 
   OR field2 LIKE "%keyword%" 
   OR field3 LIKE "%keyword%"

答案 1 :(得分:1)

但请注意,匹配多个字段只会返回第一个字段。

SELECT *,
       CASE WHEN field1 LIKE "%keyword%" THEN 'field1'
            WHEN field2 LIKE "%keyword%" THEN 'field2'
            WHEN field3 LIKE "%keyword%" THEN 'field3'
            ELSE 'no-match'
       END as matchField
FROM table
WHERE field1 LIKE "%keyword%" 
   OR field2 LIKE "%keyword%" 
   OR field3 LIKE "%keyword%"

答案 2 :(得分:1)

一个非常简单的方法是这样的:

SELECT 'field1', * 
FROM table
WHERE field1 LIKE "%keyword%" 
UNION
SELECT 'field2', * 
FROM table
WHERE field2 LIKE "%keyword%" 
UNION
SELECT 'field3', * 
FROM table
WHERE field3 LIKE "%keyword%"

答案 3 :(得分:1)

一种方法是将它们连接在一起:

SELECT t.*,
       concat_ws(',',
                 (case when field1 LIKE '%keyword%' then 'field1' end),
                 (case when field2 LIKE '%keyword%' then 'field2' end),
                 (case when field3 LIKE '%keyword%' then 'field3' end)
                ) as matchingFields
FROM table
WHERE field1 LIKE '%keyword%' OR
      field2 LIKE '%keyword%' OR
      field3 LIKE '%keyword%';

注意:对字符串常量使用(ANSI标准)单引号是个好主意。

答案 4 :(得分:1)

你也可以在一个领域内完成。

MariaDB []> SELECT
    ->   concat_ws( ', ',
    ->     IF(field1 LIKE '%keyword%','field1',NULL),
    ->     IF(field2 LIKE '%keyword%','field2',NULL),
    ->     IF(field3 LIKE '%keyword%','field3',NULL)
    ->   ) AS found_in, s.*
    ->   FROM searchtable s
    ->   WHERE field1 LIKE '%keyword%'
    ->   OR  field1 LIKE '%keyword%'
    ->   OR  field1 LIKE '%keyword%';
+------------------------+----+---------+---------+---------+
| found_in               | id | field1  | field2  | field3  |
+------------------------+----+---------+---------+---------+
| field1                 |  1 | keyword | NULL    | NULL    |
| field1, field3         |  4 | keyword | NULL    | keyword |
| field1, field2         |  6 | keyword | keyword | NULL    |
| field1, field2, field3 |  7 | keyword | keyword | keyword |
+------------------------+----+---------+---------+---------+
4 rows in set (0.01 sec)

MariaDB []>