4

あるテーブルから別のテーブルにデータを選択するクエリを作成しています。移動する必要のある列の1つはDECIMAL列です。私の制御が及ばない理由により、ソース列はコンマで区切られた数値のリストになる場合があります。これを行うためのエレガントなSQLのみの方法はありますか?

例えば:

ソース列

10.2
5,2.1
4

宛先列を作成する必要があります

10.2
7.1
4

私はMySQL4を使用しています。

4

4 に答える 4

10

この種の重要な文字列操作を行うには、ストアドプロシージャを使用する必要があります。これは、MySQLの場合、6年前のバージョン5.0でのみ登場しました。

MySQL 4は現在非常に古く、2008年のブランチ4.1の最新バージョンは4.1.25でした。サポートされなくなりました。ほとんどのLinuxディストリビューションはもうそれを提供していません。本当にアップグレードする時が来ました。

MySQL5.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 |
+--------+
于 2011-06-11T09:20:11.533 に答える
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
于 2011-06-10T20:29:20.583 に答える
0

残念ながら、mysqlには文字列分割関数または集計が含まれていないため、ストアドプロシージャまたはクライアント側でこれを行う必要があります。

于 2011-06-10T20:13:07.863 に答える
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
  ;
于 2014-06-10T20:46:56.317 に答える