免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2704 | 回复: 7
打印 上一主题 下一主题

【求教】MySQL中如何更新一个数组字串? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-10 18:57 |只看该作者 |倒序浏览
10可用积分
比如有表 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没有分割函数,网上找来的又不太好用,诚心求教,谢谢大家能帮忙!

论坛徽章:
0
2 [报告]
发表于 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

论坛徽章:
0
3 [报告]
发表于 2009-02-11 08:46 |只看该作者

回复 #2 我是DBA 的帖子

shell版的老大,来这里,也是牛人

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
4 [报告]
发表于 2009-02-11 09:07 |只看该作者
^_^人家要的是触发器!

要是用外部语言方法多着了。

论坛徽章:
0
5 [报告]
发表于 2009-02-11 10:13 |只看该作者
是的,外部计算,方法太多了。
用触发器+函数或存储过程,应该可以实现的。

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
6 [报告]
发表于 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

论坛徽章:
0
7 [报告]
发表于 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

  要触发器吧

论坛徽章:
0
8 [报告]
发表于 2009-02-11 16:00 |只看该作者
这种结构用触发器会有效率问题吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP