我有一个像这样的示例表
+----+-------+--------+---------+
| Id | Type | Format | Default |
+----+-------+--------+---------+
| 1 | IMAGE | PNG | true |
| 2 | IMAGE | PNG | false |
| 3 | IMAGE | JPG | false |
| 4 | IMAGE | JPG | true |
| 5 | VIDEO | MP4 | false |
+----+-------+--------+---------+
Run Code Online (Sandbox Code Playgroud)
我需要实现这样的查询
SELECT * FROM media WHERE type = 'IMAGE' and format = 'PNG'
Run Code Online (Sandbox Code Playgroud)
如果查询给出 0 个结果,则format需要将过滤器替换为
SELECT * FROM media WHERE type = 'IMAGE' and default = TRUE
Run Code Online (Sandbox Code Playgroud)
因此,有一个始终存在的固定过滤器(在两次尝试中),因为此示例是使用type = 'IMAGE'2 个过滤器进行的,需要根据第一个条件的结果大小进行组合
我试图了解是否有一种方法可以执行单个查询,该查询可以连接两个条件,第一个条件的某种优先级format将排除第二个条件的结果default
像这样的东西
SELECT * FROM media WHERE type = 'IMAGE' AND (format = 'PNG' OR default = TRUE)
Run Code Online (Sandbox Code Playgroud)
不合适,因为无论第一个条件是否给出至少 1 个结果,该OR条件总是给出default=TRUE记录。
我考虑过该XOR运算符,但它会排除所有非默认的 PNG 结果。相反,对于format过滤器, 的值default将被忽略
有没有办法仅使用 1 个查询来重现此行为?
预期结果
示例1)它至少存在一个PNG,因此它们被收集(默认或非默认并不重要,过滤format器优先)
conditions = [format = 'PNG' | default = true]
| 1 | IMAGE | PNG | true |
| 2 | IMAGE | PNG | false |
Run Code Online (Sandbox Code Playgroud)
例2)至少存在一张JPG,所以这些都被收集起来
conditions = [format = 'JPG' | default = true]
| 3 | IMAGE | JPG | false |
| 4 | IMAGE | JPG | true |
Run Code Online (Sandbox Code Playgroud)
示例 3) 不存在 GIF,因此收集所有默认值
conditions = [format = 'GIF' | default = true]
| 1 | IMAGE | PNG | true |
| 4 | IMAGE | JPG | true |
Run Code Online (Sandbox Code Playgroud)
您需要将 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')
Run Code Online (Sandbox Code Playgroud)