SQL-试图判断查询的哪一部分与“ OR”语句匹配

时间:2018-09-04 13:24:34

标签: mysql sql

我有一个查询,我想检查多列是否与我要查找的内容匹配,如下所示:

$params = [$param1,$param2];
$sql = "SELECT * FROM table WHERE column1 LIKE ? OR column2 LIKE ?";
$stmt = DB::run($sql,$params);

在此示例中,我必须使用两列,但在我的网站上,我有8列,并且这可能会增加。

但是我想从匹配的列而不是其他列中回显数据。

从逻辑上讲,我想要类似的东西: 如果column1匹配我的参数echo column1,否则,如果column2匹配我的参数echo column2。

我需要分别对每个查询进行查询,还是有一种方法可以告诉您何时具有“ OR”语句,如查询中的哪一部分被匹配。

我不确定我是否正确解释了这个问题,但是请让我知道是否可以澄清。任何帮助或建议,将不胜感激。

3 个答案:

答案 0 :(得分:1)

使用union,根据您的要求,您的查询应如下所示

   SELECT column1 FROM table WHERE column1 LIKE ?
    union
   SELECT column2 FROM table WHERE column2 LIKE ?

答案 1 :(得分:0)

如果您只需要一栏,我将使用此处另一个答案中所述的UNION方法。

如果您希望将某些内容嵌入更广泛的查询中,则CASE表达式可能会为您提供很好的服务。

SELECT
  *,
  CASE WHEN column1 LIKE ? THEN column1
       WHEN column2 LIKE ? THEN column2
                           ELSE   NULL   END    AS newColumn
FROM
  table
WHERE
     column1 LIKE ?
  OR column2 LIKE ?

(两个建议都假定为column1和column2是相同的数据类型。)

答案 2 :(得分:0)

如果要允许多行匹配,则可以使用union all,如下所示:

select 'column1' as which, column1 
from t 
where column1 like ?
union all
select 'column2' as which, column2 
from t 
where column2 like ?;

或者,如果性能不是很重要,而您只想列出一次条件:

select which, val
from (select 'column1' as which, column1 as val
      from t
      union all 
      select 'column2' as which, column2 
      from t 
     ) t
where val like ?;

这会在单独的行中列出每个匹配项。不过,我倾向于将它们放在一行中:

select concat_ws(',',
                 case when column1 like ? then 'column1' end,
                 case when column2 like ? then 'column1' end
                )
from t
where column1 like ? or column2 like ?;

在这种情况下,重复条件可能很麻烦,因此您也可以这样做:

select concat_ws(',',
                 case when column1 like ? then 'column1' end,
                 case when column2 like ? then 'column1' end
                ) as matches
from t
where matches > '';