Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 允许CASE语句重复匹配_Mysql_Sql_Select_Case - Fatal编程技术网

Mysql 允许CASE语句重复匹配

Mysql 允许CASE语句重复匹配,mysql,sql,select,case,Mysql,Sql,Select,Case,我如何在WHERE CASE语句中显示匹配的MatchID的所有值: SELECT `Word`, CASE WHEN `Word` LIKE 'a%' THEN 12 WHEN `Word` LIKE 'b%' THEN 13 WHEN `Word` LIKE 'a%' THEN 14 ELSE -1 END AS MatchID FROM `Words` 比如说,我的表包含a、b和c。目前,该表的结果仅显示

我如何在WHERE CASE语句中显示匹配的MatchID的所有值:

SELECT 
   `Word`, 
   CASE
       WHEN `Word` LIKE 'a%' THEN 12
       WHEN `Word` LIKE 'b%' THEN 13 
       WHEN `Word` LIKE 'a%' THEN 14
       ELSE -1 
    END AS MatchID
FROM `Words`
比如说,我的表包含a、b和c。目前,该表的结果仅显示:

a   12
b   13
我希望它也能显示:

a   14
换句话说,我希望CASE子句显示所有匹配项,而不仅仅是第一个匹配项。有什么想法吗


谢谢

也许有一种更优雅的方式来满足您的要求,但这里有一种可能的解决方案:

SELECT `Word`, 12 AS MatchID FROM `Words` WHERE `Word` like 'a%'
UNION
SELECT `Word`, 13 AS MatchID FROM `Words` WHERE `Word` like 'b%'
UNION
SELECT `Word`, 14 AS MatchID FROM `Words` WHERE `Word` like 'a%'

<强>编辑< /强>:如果性能是一个大问题,那么你也可以考虑混合方法;对a%和b%使用一个SELECT和一个CASE语句,然后对第二个a%使用另一个SELECT语句。

我认为这也应该有效

SELECT `Word`,
       COALESCE(`MatchID`, -1) AS `MatchID`
FROM   `Words`
       LEFT JOIN (SELECT 'a%' AS `Match`, 12   AS `MatchID`
                  UNION ALL
                  SELECT 'b%' AS `Match`, 13   AS `MatchID`
                  UNION ALL
                  SELECT 'a%' AS `Match`, 14   AS `MatchID`) AS `Matches`
         ON `Words`.`Word` LIKE `Matches`.`Match`  

使用您的方法,MySQL需要对表进行三次过滤,对吗?你认为这比像我那样过滤一次并检查每个单词三次要慢得多吗?@Carl,你的样本数据对我们来说毫无意义,但我觉得你应该重新考虑完整的查询。对于您编写的规范,这基本上是唯一的方法。浏览表格三次肯定比浏览一次慢;但是,我知道没有其他方法可以在一个查询中对一行进行多次计数。如果您的
word
列已正确索引以进行搜索,则性能影响应该最小。这意味着您希望a行生成2行:这没有意义。案例每行评估一次,并且短路:您有一个“a”行,所以您得到12。一行不能为一次选择生成两行。正如您所评论的,工会将增加很多开销。那么,你想要解决的实际问题是什么。。。?