【问题标题】:MySQL: fill empty strings with any non-empty value in a groupMySQL:用组中的任何非空值填充空字符串
【发布时间】:2021-09-19 04:05:19
【问题描述】:

这是一个表格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    |
-------------------------

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

【问题讨论】:

    标签: sql join mariadb sql-update sql-null


    【解决方案1】:

    使用此查询(适用于 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 语句中将其加入表中:

    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()

    【讨论】:

    • 函数 ANY_VALUE 不存在 (MariaDB 10.3) :(
    • @MichaelO。您标记了问题 MySql。
    • 对不起......我的借口,它在 MySQL 5.6 中也不存在
    • @MichaelO。 ANY_VALUE() 适用于 MySql 5.7+ 作为替代方案,正如我在回答中提到的,您可以使用 MIN() 或 MAX()
    • 它不适用于 MIN 或 MAX:fiddle
    【解决方案2】:

    这应该可行:

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 2010-09-20
      • 2013-12-19
      • 2018-07-04
      • 2013-09-16
      相关资源
      最近更新 更多