MySQL:合并行并返回默认值

标签 mysql merge coalesce ifnull

想象一下下表:

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

An SQLFiddle to test with .

就性能而言,这取决于您需要如何应用查询来获取多个字段。如果您可以使用现有联接中的 COALESCE 来解决您的列选择,我看不出有什么大问题,但如果您最终使用多个自联接来解决它,则可能会遇到问题。

关于MySQL:合并行并返回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16302005/

相关文章:

sql - 在连接中使用合并

linq - 使用 LINQ 在子查询中高级多重联接

php - 将 PHP 变量传递给 MySQL

MySQL CSV导入错误: Invalid column count

c++ - 合并的正确语法

version-control - 使用未提交的更改从 "hg update"恢复

android - 为什么我会从此方法中获得重复的记录?

php - 从外部加载 WordPress 核心文件会导致站点的其余部分使用 wordpress mysql 连接

mysql - sphinx 错误 : failed to merge index

MATLAB 第一个非空参数的返回值(内置 COALESCE 函数)