MySQL:用组中的任何非空值填充空字符串

MySQL: fill empty strings with any non-empty value in a group

这里是tabletests(简体):

-------------------------
| id | test_name | unit |
-------------------------
| 1  | Voltage   | V    |
| 2  | Current   |      |
| 3  | Frequency | Hz   |
| 4  | Voltage   | v    |
| 5  | Voltage   |      |
| 6  | Voltage   | V    |
| 7  | Current   | A    |
| 8  | Voltage   | V    |
-------------------------

我需要用其组中的任何非空值填充空 unit 字段(按 test_name),即 Voltage 的单位可能是 Vv,对于 Current,它应该是 A。有没有办法用 update ... join ... group by 或类似的东西来做到这一点?

这应该有效:

UPDATE tests AS t1 JOIN tests AS t2 USING (test_name)
SET t1.unit = t2.unit
WHERE t1.unit IS NULL AND t2.unit IS NOT NULL;

使用此查询(对于 MySql 5.7+):

SELECT test_name, ANY_VALUE(unit) unit
FROM tests
WHERE unit IS NOT NULL
GROUP BY test_name

你为每个 test_name 得到一个非空 unit(前提是这个 test_name 至少有 1 个非空 unit)。

将它加入 UPDATE 语句中的 table:

UPDATE tests t1
INNER JOIN (
  SELECT test_name, ANY_VALUE(unit) unit
  FROM tests
  WHERE unit IS NOT NULL
  GROUP BY test_name
) t2 ON t2.test_name = t1.test_name
SET t1.unit = t2.unit
WHERE t1.unit IS NULL;

参见demo

您可以使用 MIN()MAX() 代替 ANY_VALUE()