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)