mysql - 有没有办法在第一个条件匹配的情况下限制sql命令的运行?

标签 mysql case

例如我有一个查询:

SELECT  s.e ,
        v.T ,
        v.G ,
        CASE WHEN ( s.a = 'M'
                    AND s.b = 'N'
                    AND s.c = 'O'
                    AND s.d = 'P'
                    AND s.e = 'Q'
                  ) THEN '0'
             WHEN ( s.a = 'M'
                    AND s.b = 'N'
                    AND s.c = 'O'
                    AND s.d = 'P'
                  ) THEN '1'
             ELSE '2'
        END AS type
FROM    table_v AS v
        LEFT OUTER JOIN table_s AS s ON ( v.a = s.a
                                         AND v.b = s.b
                                         AND v.c = s.c
                                       )
WHERE   ( s.a = 'M'
          AND s.b = 'N'
          AND s.c = 'O'
          AND s.d = 'P'
          AND s.e = 'Q'
        )
        OR ( s.a = 'M'
             AND s.b = 'N'
             AND s.c = 'O'
             AND s.d = 'P'
           )
        OR ( s.a = 'M'
             AND s.b = 'N'
           )

如果第一个成功,有没有办法在 WHERE 子句中不运行第二个 OR 。第二个 OR 相同,如果第一个失败而第二个成功,则忽略第三个语句。目前我正在 SELECT 中使用一个案例来过滤出我需要的内容。在这种情况下,我必须在根据 CASE 类型的值检索结果集后再次循环,这会减慢一切。

我还考虑过为每个 OR 语句分别执行 UNION,但即使在这种情况下,也无法执行“BREAK”

还研究了 where 子句中的 CASE,但这也会减慢速度,并且仍然会得到多个我并不真正需要的结果。

最佳答案

当您在左连接表上使用 where 子句条件时,您会覆盖该表行不存在的能力(除非您允许 NULL)。在这种情况下,每个过滤条件都要求存在 table_s 中的行,因此您应该使用更有效的内部联接。

FROM    table_v AS v
        INNER JOIN table_s AS s ON ( v.a = s.a
                                         AND v.b = s.b
                                         AND v.c = s.c
                                       )

where 子句中没有“break”功能。然而,您当前的条件似乎并未形成排他子集,因为所有集合 1 (M+N+O+P+Q) 都适合集合 2 (M+N+O+P),而集合 2 (M+N+O+P) 又适合集合 3 (M +N)

您是否需要附加条件才能使其具有排他性?

WHERE   ( s.a = 'M'
          AND s.b = 'N'
          AND s.c = 'O'
          AND s.d = 'P'
          AND s.e = 'Q'
        )
        OR ( s.a = 'M'
             AND s.b = 'N'
             AND s.c = 'O'
             AND s.d = 'P'
             AND NOT s.e = 'Q'
           )
        OR ( s.a = 'M'
             AND s.b = 'N'
             AND NOT (
                          s.c = 'O'
                      AND s.d = 'P'
                      AND s.e = 'Q'
                     )
           )

关于mysql - 有没有办法在第一个条件匹配的情况下限制sql命令的运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32366126/

相关文章:

Php-mysqli多次连接到数据库

sql - 如何在 MySQL 中格式化日期列?

php - 使用 PHP 文件仅从 mySQL 数据库中导出某些列

MySQL/玛丽亚数据库 : Can't create a procedure using the case statement

MYSQL 情况下根本不工作

mysql - 如何构建一个大的值列?

mysql - influxDB 中的 AS 子句

php - Mysql查询计数某些值

mysql - SQL case 语句 - 根据另外 2 个表从第三个表中选择值

mysql - 如何通过比较更新mysql cols