优先于OR条件的SQL查询

时间:2016-11-17 07:40:47

标签: mysql sql xor

我有一个像这样的样本表

+----+-------+--------+---------+
| Id | Type  | Format | Default |
+----+-------+--------+---------+
|  1 | IMAGE | PNG    | true    |
|  2 | IMAGE | PNG    | false   |
|  3 | IMAGE | JPG    | false   |
|  4 | IMAGE | JPG    | true    |
|  5 | VIDEO | MP4    | false   |
+----+-------+--------+---------+

我需要实现像这样的查询

SELECT * FROM media WHERE type = 'IMAGE' and format = 'PNG'

如果查询结果为0,则format过滤器需要替换为

SELECT * FROM media WHERE type = 'IMAGE' and default = TRUE

所以,有一个固定的过滤器总是存在(在两次尝试中),因为这个例子是使用type = 'IMAGE'和2个过滤器,需要根据第一个条件的结果大小进行组合

我试图了解是否有办法进行单个查询,可以加入这两个条件,第一个条件format的某种优先级将排除第二个条件的结果{ {1}}

像这样的东西

default

不合适,因为无论第一个条件是否给出至少1个结果,SELECT * FROM media WHERE type = 'IMAGE' AND (format = 'PNG' OR default = TRUE) 条件将始终给出OR个记录。

我考虑了default=TRUE运算符,但它会排除所有非默认的PNG结果。而不是XOR过滤器,format的值将被忽略

有没有办法仅使用1个查询来重现此行为?

预期结果

示例1)它至少存在一个PNG,因此收集这些PNG(默认或非默认无关紧要,default过滤器具有优先权)

format

示例2)至少存在JPG,因此收集了

conditions = [format = 'PNG' | default = true]
|  1 | IMAGE | PNG    | true    |
|  2 | IMAGE | PNG    | false   |

示例3)不存在GIF,因此收集了所有默认值

conditions = [format = 'JPG' | default = true]
|  3 | IMAGE | JPG    | false   |
|  4 | IMAGE | JPG    | true    |

3 个答案:

答案 0 :(得分:1)

您需要将NOT EXIST子句与default = true谓词一起使用。

SELECT * FROM media
WHERE (format = 'PNG' AND type = 'IMAGE')
OR (NOT EXISTS (SELECT 1 FROM media WHERE format = 'PNG' AND type = 'IMAGE')
AND default = 'true')

答案 1 :(得分:1)

您可以使用UNION进行两次查询:

SELECT * FROM media WHERE type = 'IMAGE' and format = 'PNG'

UNION ALL

SELECT * FROM media 
WHERE type = 'IMAGE' and default = TRUE  
  AND NOT EXISTS(SELECT 1 FROM media WHERE type = 'IMAGE' and format = 'PNG')

答案 2 :(得分:0)

考虑到基于优先级的查询,我认为以下查询可能确实有效。

我使用以下查询重现了您上面描述的相同结果。

shouldComponentUpdate(newProps, newState) {
  return !_.isEqual(newsProps, this.props) || !_.isEqual(newState, this.state);
}

以上查询将通过检查条件包括SELECT * FROM media WHERE `type` = 'IMAGE' AND CASE WHEN (SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END FROM `media` WHERE `type` = 'IMAGE' AND `format` = 'PNG') = 1 THEN `format` = 'PNG' ELSE `default` = 'true' END 来查找ROWS的总计数。如果发现它将仅应用type = 'IMAGE' AND format = 'PNG'条件,否则它将根据条件format = 'PNG'查找数据