我有一个查询,我想检查多列是否与我要查找的内容匹配,如下所示:
$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”语句,如查询中的哪一部分被匹配。
我不确定我是否正确解释了这个问题,但是请让我知道是否可以澄清。任何帮助或建议,将不胜感激。
答案 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 > '';