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
的单位可能是 V
或 v
,对于 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()
。
这里是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
的单位可能是 V
或 v
,对于 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()
。