想象一下下表:
id | variant | name
-----------------------
1 | 1 | a
1 | 2 | b
1 | 3 | c
2 | 1 | d
2 | 2 | e
2 | 3 | NULL
3 | 1 | g
我需要运行哪个 SQL 语句才能得到这个:
- 对于给定的 id 和给定的变体,获取该组合的名称。
- 但是,如果名称为 NULL,则获取具有给定 id 但具有变体 1 的行的名称(变体 1 的名称决不为 NULL)。
- 如果没有包含给定变体的行,请再次使用具有相同 ID 的变体为 1 的行。
- 永远不会直接请求变体 1。
这就像一个后备机制。或者您可以将其视为覆盖变量 = 1 的行的值。
示例:
- id = 1,变体 = 2:b
- id = 1,变体 = 3:c
- id = 2,变体 = 3:d
- id = 3,变体 = 5:g
这可以用 SQL 实现吗?如果该机制应用到更多领域,效果是否良好?
谢谢!
更新:
请注意,我希望这种机制不仅仅适用于名称字段。应该有更多的列应该具有相同的行为 - 但每个列都应该单独对待。
最佳答案
这应该可以满足您使用LEFT JOIN
获取可选值的需要。
SELECT COALESCE(b.Name,a.Name)
FROM Table1 a
LEFT JOIN Table1 b
ON a.id=b.id AND b.variant=@y
WHERE a.id=@x AND a.variant=1
就性能而言,这取决于您需要如何应用查询来获取多个字段。如果您可以使用现有联接中的 COALESCE
来解决您的列选择,我看不出有什么大问题,但如果您最终使用多个自联接来解决它,则可能会遇到问题。
关于MySQL:合并行并返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16302005/