Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL 4(不是5)中求逗号分隔列的和_Mysql_Mysql4 - Fatal编程技术网

在MySQL 4(不是5)中求逗号分隔列的和

在MySQL 4(不是5)中求逗号分隔列的和,mysql,mysql4,Mysql,Mysql4,我正在编写一个查询,将数据从一个表中选择到另一个表中,需要移动的列之一是十进制列。出于我无法控制的原因,源列有时可能是逗号分隔的数字列表。有没有一种优雅的sql唯一方法可以做到这一点 例如: 源列 10.2 5,2.1 4 应该生成目标列 10.2 7.1 4 我使用的是MySQL 4,顺便说一句。不幸的是,MySQL不包含字符串拆分函数或聚合,因此您需要在存储过程或客户端执行此操作。下面是一个用于拆分字符串的MySQL函数: CREATE FUNCTION SPLIT_STR( x V

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

例如:

源列

10.2
5,2.1
4
应该生成目标列

10.2
7.1
4

我使用的是MySQL 4,顺便说一句。

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

下面是一个用于拆分字符串的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

要进行这种非平凡的字符串操作,需要使用存储过程,对于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 |
+--------+

在这个链接中可以找到一种基于数字表的解析方法。本质上,一旦有了子字符串,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 4对您的需求来说是一个很大的限制。不,可以有N个值。我认为这至少有点帮助,不知道否决票是什么…很好的解决方案。有可能在MySQL中运行一个评估程序吗?