OR 条件优先的 SQL 查询

Dev*_*ter 5 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   |
+----+-------+--------+---------+
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)

wvd*_*vdz 3

您需要将 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)