Mysql 非集合式WHERE或子句

Mysql 非集合式WHERE或子句,mysql,sql,where,Mysql,Sql,Where,“非集体”不是正确的术语,因此请建议更好的描述,我将修改:) 基本上,我有一个问题如下: SELECT image_id, image_col1, image_col2 FROM images WHERE ( (image_col1 = 2 AND image_col2 = 3) OR (image_col1 = 2 AND image_col2 = 0) OR (image_col1 = 1 AND image_col2 = 0) )

“非集体”不是正确的术语,因此请建议更好的描述,我将修改:)

基本上,我有一个问题如下:

SELECT 
  image_id, image_col1, image_col2
FROM
  images 
WHERE (
    (image_col1 = 2 AND image_col2 = 3) 
    OR
    (image_col1 = 2 AND image_col2 = 0) 
    OR
    (image_col1 = 1 AND image_col2 = 0)
  )
这将返回四行:

+----------+------------+------------+
| image_id | image_col1 | image_col2 |
+----------+------------+------------+
|         1|           2|           3|
+----------+------------+------------+
|         2|           2|           3|
+----------+------------+------------+
|         3|           2|           0|
+----------+------------+------------+
|         4|           1|           0|
+----------+------------+------------+
我想让它做的是忽略其他部分,如果其中一个条件找到一些行,即在本例中,我只想要前两行,因为它们与第一个条件匹配,如果没有匹配的条件,我只想要第三行,因为它与第二个条件匹配

目前,我正在运行3个查询,每个条件一个查询,然后使用第一个不是空结果的查询,但希望尝试在一个查询中执行

我基本上不希望它组合条件来查找与其中任何一个匹配的行,我希望它在条件返回某个内容时停止

这可能吗?

试试这个

SELECT image_id, image_col1, image_col2, 
       case when (image_col1 = 2 AND image_col2 = 3) then 1 else 0 
       case when (image_col1 = 2 AND image_col2 = 0) then 1 else 0
       case when (image_col1 = 1 AND image_col2 = 0) then 1 else 0
     END as img 
     FROM images

在级联中应用不同的规则并非易事。
使用
CTE
的可能性至少有助于提高可读性

SELECT i.image_id, i.image_col1, i.image_col2
FROM   (SELECT image_id, image_col1, image_col2
             , CASE WHEN (image_col1 = 2 AND image_col2 = 3) THEN 1
                    WHEN (image_col1 = 2 AND image_col2 = 0) THEN 2
                    WHEN (image_col1 = 1 AND image_col2 = 0) THEN 3 
                    ELSE 0 
               END Cond
        FROM   images) i
       INNER JOIN (SELECT MIN(CASE 
                                WHEN (image_col1 = 2 AND image_col2 = 3) 
                                  THEN 1
                                WHEN (image_col1 = 2 AND image_col2 = 0) 
                                  THEN 2
                                WHEN (image_col1 = 1 AND image_col2 = 0) 
                                  THEN 3 
                                ELSE 0 
                              END) Cond
                   FROM   images) a ON i.Cond = a.Cond

两个子查询中的字段
Cond
返回应用于该行的规则,该规则必须相互排斥。
第二个子查询应用相同的规则来获取应用于数据集的第一个规则,这就是为什么规则被编号而不是简单地检查

如果不使用
连接
检查
WHERE
中的条件,也可以执行相同的操作

SELECT image_id, image_col1, image_col2
FROM   images
WHERE  CASE WHEN (image_col1 = 2 AND image_col2 = 3) THEN 1
            WHEN (image_col1 = 2 AND image_col2 = 0) THEN 2
            WHEN (image_col1 = 1 AND image_col2 = 0) THEN 3 
            ELSE 0 
       END
       = 
       (SELECT MIN(CASE WHEN (image_col1 = 2 AND image_col2 = 3) THEN 1
                        WHEN (image_col1 = 2 AND image_col2 = 0) THEN 2
                        WHEN (image_col1 = 1 AND image_col2 = 0) THEN 3 
                        ELSE 0 
                   END) Cond
        FROM   images)