现有字符串,长度固定,内容如下
'-1,-1,-1,-1,-1,-1,-1,-1,-1,-1'
中间按逗号开。现在知道要改的位置,如2,那就是要修改第2个-1.我测试的代码如下,@a是位置,11是修改后的值。
mysql> set @A=1;
Query OK, 0 rows affected (0.00 sec)mysql> select concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),',11,',SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10)
);
+--------------------------------------------------------------------------------------------------------------------------------------+
| concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),',11,',SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10)) |
+--------------------------------------------------------------------------------------------------------------------------------------+
| ,11,-1,-1,-1,-1,-1,-1,-1,-1,-1                                                                                                       |
+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> set @A=2;
Query OK, 0 rows affected (0.00 sec)mysql> select concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),',11,',SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10)
);
+--------------------------------------------------------------------------------------------------------------------------------------+
| concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),',11,',SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10)) |
+--------------------------------------------------------------------------------------------------------------------------------------+
| -1,11,-1,-1,-1,-1,-1,-1,-1,-1                                                                                                        |
+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql> set @A=10;
Query OK, 0 rows affected (0.00 sec)mysql> select concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),',11,',SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10)
);
+--------------------------------------------------------------------------------------------------------------------------------------+
| concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),',11,',SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10)) |
+--------------------------------------------------------------------------------------------------------------------------------------+
| -1,-1,-1,-1,-1,-1,-1,-1,-1,11,                                                                                                       |
+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)mysql>
在处理第1位和第10位的时候,会多出来个逗号。该如何处理?看看大家有没有其他的办法解决这个问题。

解决方案 »

  1.   

    逗号问题可以用CASE搞定。
    如下
    set @A=10;
    select concat( SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-1),case @A when 1 then '2,' when 10 then ',2' else ',2,' end ,SUBSTRING_INDEX('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',',@A-10));
      

  2.   


    set @a='-1,-1,-1,-1,-1,-1,-1,-1,-1,-1';
    set @b=2;
    select concat(concat(mid(@a,1,3(@b-1)),
    replace(mid(@a,3(@b-1)+1,2),"-1","11")),
    mid(@a,3*@b,length(@a)-3(@b-1)-2));
      

  3.   


    set @a='-1,-1,-1,-1,-1,-1,-1,-1,-1,-1';
    set @b=2;
    select concat(concat(mid(@a,1,3(@b-1)),"11"),
    mid(@a,3*@b,length(@a)-3(@b-1)-2));
      

  4.   

    建立临时表lsb2,字段ID,1-10000
    SET @b=CONCAT(',','-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',',');
    SET @A=0;
    set @c=3;
    DROP TABLE IF EXISTS newtt;
    CREATE TEMPORARY TABLE newtt AS 
    SELECT *,@A:=@a+1 AS pm FROM (
    SELECT *,SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1) AS newco
     FROM
    (SELECT CAST(@b AS CHAR) AS aa ) a LEFT JOIN lsb2 b ON LENGTH(aa)>=b.id AND 
    SUBSTR(AA,ID,1)=',' AND SUBSTR(AA,ID+1,LOCATE(',',AA,ID+1)-ID-1)<>'') a;
    UPDATE newtt SET newco=11 WHERE pm=@c; 
    SELECT GROUP_CONCAT(newco) FROM newtt
      

  5.   

    回6楼
    mid(@a,1,3(@b-1))
    替换后得到
    mid('-1,-1,-1,-1,-1,-1,-1,-1,-1,-1',1,3(2-1))不对吧。这个语法。
    试试7楼先。
      

  6.   

    set @a='-1,-1,-1,-1,-1,-1,-1,-1,-1,-1';
    set @b=2;
    select concat(concat(mid(@a,1,3*(@b-1)),"11"),
    mid(@a,3*@b,length(@a)-3*(@b-1)-2));忘记加*了。
      

  7.   

    正在学postgresql的存储过程