我有一个像这样的样本表
+----+-------+--------+---------+
| 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 |
答案 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'
查找数据