Суммирование разделенных запятыми столбцов в MySQL 4 (не 5) - PullRequest
4 голосов
/ 11 июня 2011

Я пишу запрос, который выбирает данные из одной таблицы в другую, один из столбцов, который необходимо переместить, является столбцом DECIMAL. По независящим от меня причинам исходный столбец может иногда представлять собой список чисел, разделенных запятыми. Есть ли элегантный sql единственный способ сделать это?

Например:

исходный столбец

10.2
5,2.1
4

Должен произвести столбец назначения

10.2
7.1
4

Я использую MySQL 4, кстати.

Ответы [ 4 ]

9 голосов
/ 11 июня 2011

Для выполнения такого рода нетривиальных манипуляций со строками вам нужно использовать хранимые процедуры, которые для 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 |
+--------+
2 голосов
/ 11 июня 2011

Вот функция 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
0 голосов
/ 11 июня 2014

По этой ссылке 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
  ;
0 голосов
/ 11 июня 2011

К сожалению, mysql не включает функции разделения строк или агрегаты, поэтому вам придется делать это либо в хранимой процедуре, либо на стороне клиента.

...