问题描述
这是一个表 A.cpp
(简化):
tests
我需要用其组中的任何非空值填充空的 -------------------------
| 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
或V
和 v
应该是 Current
。有没有办法用 A
或类似的东西来做到这一点?
解决方法
这应该有效:
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
(前提是此 unit
至少有 1 个非空 test_name
)。
在 UPDATE
语句中将其加入表:
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。
您可以使用 ANY_VALUE()
或 MIN()
代替 MAX()
。