我正在编写一个查询,将一个表中的数据选择到另一个表中,其中一个需要移动的列是DECIMAL列。由于我无法控制的原因,源列有时可以是逗号分隔的数字列表。是否有一种优雅的SQL只能这样做?
例如:
源列
10.2
5,2.1
4
应该生成目标列
10.2
7.1
4
我正在使用MySQL 4,顺便说一句。
答案 0 :(得分:9)
要进行这种非平凡的字符串操作,您需要使用存储过程,对于MySQL,仅在6年前出现在5.0版本中。
MySQL 4现在已经很老了,分支4.1的最新版本是4.1.25,在2008年。它不再受支持了。大多数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 |
+--------+
答案 1 :(得分:2)
这是一个用于拆分字符串的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
答案 2 :(得分:0)
不幸的是,mysql不包含字符串拆分函数或聚合,因此您需要在存储过程或客户端执行此操作。
答案 3 :(得分:0)
可以在此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
;