【问题标题】:how to split a string by delimiter and save it as json object in mysql如何通过分隔符拆分字符串并将其保存为mysql中的json对象
【发布时间】:2019-06-19 09:03:47
【问题描述】:

所以目前我的表中有数据

Numbers (Varchar 255)
111|1232|234
434|234
12546|3243|3434
23434|34
35465|3434

当前,该列是 VARCHAR,但我计划将其转换为 JSON 字段,因此我尝试在转换字段之前将它们设为 json 或数组。

我试着按照这个

CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
   LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
   delim, '');

但似乎我必须手动指定索引。

【问题讨论】:

    标签: mysql mysql-json


    【解决方案1】:

    对于像这样的简单结构,您可以尝试使用替换和连接

    select cast(concat('[', replace('1|2|3', '|', ', '), ']') as JSON); -- for convert to text select cast(concat('["', replace('1|2|3', '|', '", "'), '"]') as JSON);

    【讨论】:

      【解决方案2】:

      您可以使用这样的查询:

      SELECT  SUBSTRING_INDEX(SUBSTRING_INDEX( CONCAT('|',n.Numbers,'|') , '|', i.id), '|', -1) AS nums
      FROM num n
      CROSS JOIN (
      SELECT 2 AS id UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 ) AS i
      HAVING nums <> ''
      ORDER BY n.id
      

      示例

      MariaDB [num]> select * from num;
      +----+--------------+
      | id | Numbers      |
      +----+--------------+
      |  1 | 111|1232|234 |
      |  2 | 2|44|55|999  |
      |  3 | NULL         |
      |  4 | 99|11        |
      +----+--------------+
      4 rows in set (0.000 sec)
      
      MariaDB [num]> SELECT  SUBSTRING_INDEX(SUBSTRING_INDEX( CONCAT('|',n.Numbers,'|') , '|', i.id), '|', -1) AS nums
          -> FROM num n
          -> CROSS JOIN (
          -> SELECT 2 AS id UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 ) AS i
          -> HAVING nums <> ''
          -> ORDER BY n.id
          -> ;
      +------+
      | nums |
      +------+
      | 111  |
      | 1232 |
      | 234  |
      | 2    |
      | 44   |
      | 55   |
      | 999  |
      | 99   |
      | 11   |
      +------+
      9 rows in set (0.001 sec)
      
      MariaDB [num]>
      

      【讨论】:

      • 不应该像["111","1232","234"]这样的输出在php中爆炸
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多