【问题标题】:Summing a comma separated column in MySQL 4 (not 5)在 MySQL 4(不是 5)中对逗号分隔的列求和
【发布时间】:2011-09-12 18:46:51
【问题描述】:

我正在编写一个查询,将数据从一个表中选择到另一个表中,需要移动的列之一是 DECIMAL 列。由于我无法控制的原因,源列有时可能是逗号分隔的数字列表。有没有一种优雅的 sql 唯一方法可以做到这一点?

例如:

来源栏

10.2
5,2.1
4

应该产生一个目标列

10.2
7.1
4

顺便说一句,我正在使用 MySQL 4。

【问题讨论】:

  • 我认为您需要查看这种情况下的存储过程。
  • 每个字段的最大值数是 2 还是您可以有更多?可以使用脚本语言吗? Mysql 4 可以满足您的需求。
  • 不,可以有 N 个值。

标签: mysql mysql4


【解决方案1】:

可以在此SQLFiddle 链接中找到基于数字表的解析方法。本质上,一旦你有了子字符串,sum 函数就会自动转换数字。为方便起见:

create table scores (id int primary key auto_increment, valueset varchar(30));
insert into scores (valueset) values ('7,6,8');
insert into scores (valueset) values ('3,2');

create table numbers (n int primary key auto_increment, stuffer varchar(3));
insert into numbers (stuffer) values (NULL);
insert into numbers (stuffer) values (NULL);
insert into numbers (stuffer) values (NULL);
insert into numbers (stuffer) values (NULL);
insert into numbers (stuffer) values (NULL);

SELECT ID, SUM(SCORE) AS SCORE
FROM (
        SELECT
          S.id
          ,SUBSTRING_INDEX(SUBSTRING_INDEX(S.valueset, ',', numbers.n),',',-1) score
          , Numbers.n
        FROM
          numbers
          JOIN scores S ON CHAR_LENGTH(S.valueset)
            -CHAR_LENGTH(REPLACE(S.valueset, ',', ''))>=numbers.n-1
) Z
GROUP BY ID
  ;

【讨论】:

    【解决方案2】:

    要进行这种非平凡的字符串操作,您需要使用存储过程,对于 MySQL,它仅在 6 年前的 5.0 版本中出现。

    MySQL 4 现在已经很老了,分支 4.1 的最新版本是 2008 年的 4.1.25。不再支持。大多数 Linux 发行版不再提供它。是时候升级了。

    这是适用于 MySQL 5.0+ 的解决方案:

    DELIMITER //
    CREATE FUNCTION SUM_OF_LIST(s TEXT)
      RETURNS DOUBLE
      DETERMINISTIC
      NO SQL
    BEGIN
      DECLARE res DOUBLE DEFAULT 0;
      WHILE INSTR(s, ",") > 0 DO
        SET res = res + SUBSTRING_INDEX(s, ",", 1);
        SET s = MID(s, INSTR(s, ",") + 1);
      END WHILE;
      RETURN res + s;
    END //
    DELIMITER ;
    

    例子:

    mysql> SELECT SUM_OF_LIST("5,2.1") AS Result;
    +--------+
    | Result |
    +--------+
    |    7.1 |
    +--------+
    

    【讨论】:

    • 不错的解决方案。有可能在 MySQL 中运行 eval 或 math purpouses?
    【解决方案3】:

    这是一个分割字符串的mysql函数:

    CREATE FUNCTION SPLIT_STR(
      x VARCHAR(255),
      delim VARCHAR(12),
      pos INT
    )
    RETURNS VARCHAR(255)
    RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
           LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
           delim, '');
    

    你必须这样使用它:

    SELECT SPLIT_STR(FIELD, ',', 1) + SPLIT_STR(FIELD, ',', 2)  FROM TABLE
    

    【讨论】:

      【解决方案4】:

      不幸的是,mysql 不包含字符串拆分函数或聚合,因此您需要在存储过程或客户端执行此操作。

      【讨论】:

      • 我认为这至少有点帮助,不知道反对票是为了什么......
      猜你喜欢
      • 2014-03-16
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2023-03-07
      • 2023-04-06
      • 1970-01-01
      • 2018-12-25
      相关资源
      最近更新 更多