【问题标题】:How to split a result from select column in mySQL to a mutiple columns如何将结果从 mySQL 中的选择列拆分为多个列
【发布时间】:2017-07-15 02:44:27
【问题描述】:

我在 MYSQL 数据库中有列想提取该列数据并将其拆分为多个列这是我想拆分的数据示例

```

{"1744":"1","1745":"1","1747":"1","1748":"1","1749":"1","1750":"1"}
{"1759":"1"}
{"47":"1","48":"Ehebr","49":"1479977045596.jpg"}

``` 我想用第一个数据将它分成两列:

当您注意到这些数据有不同的长度并希望能够拆分任何长度的数据时,请看这里 [How to split a resulting column in multiple columns 但我不认为那是我想要的结果我得到的结果就像 也想修剪数据上的所有其他大括号和引号。到目前为止,这是我的代码 ```

SELECT combined,SUBSTRING_INDEX( combined , ':', 1 ) AS a,
SUBSTRING_INDEX(SUBSTRING_INDEX( combined , ':', 2 ),':',-1) AS b,
 SUBSTRING_INDEX(SUBSTRING_INDEX( combined , ':', -2 ),':',1) AS c,
 SUBSTRING_INDEX( combined , ':', -1 ) AS d
FROM tablefoo WHERE combined is not null;

```

【问题讨论】:

    标签: mysql split substring trim


    【解决方案1】:

    如果您可以使用过程和游标

    drop procedure if exists p;
    delimiter //
    CREATE DEFINER=`root`@`localhost` PROCEDURE `p`(
        IN `instring` varchar(255)
    
    )
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
    begin
    declare   tempstring varchar(10000);
    declare   outstring  varchar(100);
    declare   c1 varchar(100);
    declare   c2 varchar(100);
    declare  checkit int;
    declare done int;
    DECLARE CUR1 CURSOR for SELECT t.col  FROM T;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
    drop table if exists occursresults;
    create table occursresults (col1 varchar(20), col2 varchar(20));
    
    open CUR1;
    read_loop: LOOP
            FETCH CUR1  INTO tempstring;
    
            if done then leave read_loop; end if;
    
            set tempstring = replace(tempstring,'{','');
            set tempstring = replace(tempstring,'}','');
            set tempstring = replace(tempstring,'"','');
            set checkit = 0;
            #select tempstring;
    
            looper: while   tempstring is not null and instr(tempstring,',') > 0 do
                    set checkit = checkit + 1;
                    if checkit > 100 then #In case of infinite loop
                        leave looper;
                    end if;
                    set outstring = substr(tempstring,1,instr(tempstring, ',') - 1);
                    set tempstring = ltrim(rtrim(replace(tempstring,concat(outstring,','),'')));
                    set c1 = substr(outstring,1,instr(outstring, ':') - 1);
                    set c2 = replace(outstring,concat(c1,':'),'');
                    INSERT INTO OCCURSRESULTS (COL1,COL2) VALUES (c1,c2);
            #       select tempstring,outstring,c1,c2;      
            end while;
            #select tempstring;
            set outstring = tempstring; 
            set c1 = substr(outstring,1,instr(outstring, ':') - 1);
            set c2 = replace(outstring,concat(c1,':'),'');
            INSERT INTO OCCURSRESULTS (Col1,Col2) VALUES (c1,c2);
    
    
    end loop;
    close cur1;
    
    end //
    
    delimiter ;
    
    MariaDB [sandbox]> select * from t;
    +---------------------------------------------------------------------+
    | col                                                                 |
    +---------------------------------------------------------------------+
    | {"1744":"1","1745":"1","1747":"1","1748":"1","1749":"1","1750":"1"} |
    | {"1759":"1"}                                                        |
    | {"47":"1","48":"Ehebr","49":"1479977045596.jpg"}                    |
    +---------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    
    MariaDB [sandbox]>
    MariaDB [sandbox]> call p(1);
    Query OK, 0 rows affected (0.65 sec)
    
    MariaDB [sandbox]>
    MariaDB [sandbox]> SELECT * FROM OCCURSRESULTS;
    +------+-------------------+
    | col1 | col2              |
    +------+-------------------+
    | 1744 | 1                 |
    | 1745 | 1                 |
    | 1747 | 1                 |
    | 1748 | 1                 |
    | 1749 | 1                 |
    | 1750 | 1                 |
    | 1759 | 1                 |
    | 47   | 1                 |
    | 48   | Ehebr             |
    | 49   | 1479977045596.jpg |
    +------+-------------------+
    10 rows in set (0.00 sec)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2017-05-20
      • 2021-06-03
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多