Chinaunix

标题: 【求教】MySQL中如何更新一个数组字串? [打印本页]

作者: griefhy    时间: 2009-02-10 18:57
标题: 【求教】MySQL中如何更新一个数组字串?
比如有表 tmp_table
内容如下
id        test1                test2                test3                。。。
1        1,2,3,1,2,3        8,5,3,1,9,3        8,2,3,1,4,0        。。。
...
...
其中,所有列均为 varchar 类型,里面都是数字,现在我想写一个触发器,想要更新的时候进行计算,比如
现在有字串数据 2,5,7,3,2,6 进来更新 test1
update tmp_table set test1 = ???
如何才能得到 两个字串相加的结果? test1 = 3,7,10,4,4,9 ?
因为mysql没有分割函数,网上找来的又不太好用,诚心求教,谢谢大家能帮忙!
作者: 我是DBA    时间: 2009-02-10 21:42
a='1,2,3,1,2,3'  
b='2,5,7,3,2,6'
  1. echo -e $a"\n"$b |awk -F, -v OFS=, '{for(i=1;i<=NF;i++)a[i]+=$i}END{for(i=1;i<=NF;i++)printf a[i] ","}'|sed
  2. 's/.$//'   
复制代码

3,7,10,4,4,9
作者: todayhero    时间: 2009-02-11 08:46
标题: 回复 #2 我是DBA 的帖子
shell版的老大,来这里,也是牛人
作者: 枫影谁用了    时间: 2009-02-11 09:07
^_^人家要的是触发器!

要是用外部语言方法多着了。
作者: griefhy    时间: 2009-02-11 10:13
是的,外部计算,方法太多了。
用触发器+函数或存储过程,应该可以实现的。
作者: 枫影谁用了    时间: 2009-02-11 10:59
DELIMITER //

DROP PROCEDURE IF EXISTS split_string //
CREATE PROCEDURE split_string (
    IN input TEXT
    , IN delimiter VARCHAR(10)
)
SQL SECURITY INVOKER
COMMENT
'Splits a supplied string using using the given delimiter,
placing values in a temporary table'

BEGIN
    DECLARE cur_position INT DEFAULT 1 ;
    DECLARE remainder TEXT;
    DECLARE cur_string VARCHAR(1000);
    DECLARE delimiter_length TINYINT UNSIGNED;
   
    DROP TEMPORARY TABLE IF EXISTS SplitValues;
    CREATE TEMPORARY TABLE SplitValues (
        value VARCHAR(1000) NOT NULL PRIMARY KEY
    ) ENGINE=MEMORY;
   
    SET remainder = input;
    SET delimiter_length = CHAR_LENGTH(delimiter);
   
    WHILE CHAR_LENGTH(remainder) > 0 AND cur_position > 0 DO
        SET cur_position = INSTR(remainder, delimiter);
        IF cur_position = 0 THEN
            SET cur_string = remainder;
        ELSE
            SET cur_string = LEFT(remainder, cur_position - 1);
        END IF;
        IF TRIM(cur_string) != '' THEN
            INSERT INTO SplitValues VALUES (cur_string);
        END IF;
        SET remainder = SUBSTRING(remainder, cur_position + delimiter_length);
    END WHILE;
   
END //

DELIMITER ;

/*
Tests
*/


CALL split_string("Steve,Jan,Bobby,Jay,Kaj,Colin",",");

SELECT * FROM SplitValues;

CREATE TEMPORARY TABLE TestJoin (join_field VARCHAR(20) PRIMARY KEY) ENGINE=MEMORY;

INSERT INTO TestJoin VALUES ('Kaj'),('Colin');

SELECT tj.* FROM TestJoin tj
INNER JOIN SplitValues sv
ON tj.join_field = sv.value;


没试,研究下
http://bbs.163jsp.com/posts/list/309.html
作者: webyuhang    时间: 2009-02-11 11:30
原帖由 我是DBA 于 2009-2-10 21:42 发表
a='1,2,3,1,2,3'  
b='2,5,7,3,2,6'
echo -e $a"\n"$b |awk -F, -v OFS=, '{for(i=1;i

  要触发器吧
作者: sunnyfun    时间: 2009-02-11 16:00
这种结构用触发器会有效率问题吧




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2