MySQL - 拆分字段并将结果插入列中

时间:2014-12-04 15:14:27

标签: mysql sql split

我尝试拆分字段(在某个分隔符处,在下面的示例中使用';')并将拆分的结果插入表中。我试图做的事情如下表所示。

注意:FIRST行中的分号(;)分隔的值绝不会超过3个,但可以少于3个。

mysql> SELECT * FROM new;
+-------+------+------+------+
| first | a    | b    | c    |
+-------+------+------+------+
| a;b;c | NULL | NULL | NULL |
| d;e;f | NULL | NULL | NULL |
| g;h   | NULL | NULL | NULL |
| i     | NULL | NULL | NULL |
+-------+------+------+------+

查询结果应该类似于

mysql> SELECT * FROM new;
+-------+------+------+------+
| first | a    | b    | c    |
+-------+------+------+------+
| a;b;c | a    | b    | c    |
| d;e;f | d    | e    | f    |
| g;h   | g    | h    | NULL |
| i     | i    | NULL | NULL |
+-------+------+------+------+

我一直试图使用的查询是(此特定内容仅检索第一个值)。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(first, ';', 1), ';', -1) FROM new;

但是,当分隔字符的数量少于3时,这种方法不会提供任何帮助,因为它将返回它遇到的第一个字符而不是NULL或空字符串("" )。

任何人都有任何线索如何解决这个问题?

干杯

3 个答案:

答案 0 :(得分:1)

我使用CASE WHEN确定是否有1个或更多分号

<强> SQL Fiddle Demo

SELECT 
  first,
  SUBSTRING_INDEX(first, ';', 1) AS 'a',
  CASE 
    WHEN LOCATE(';', first, 1) = 0 THEN NULL 
    ELSE SUBSTRING_INDEX(SUBSTRING_INDEX(first, ';', 2), ';', -1)
  END AS 'b',
  CASE 
    WHEN LOCATE(';', first, 1) = 0 THEN NULL
    WHEN LOCATE(';', first, (LOCATE(';', first, 1) + 1)) = 0 THEN NULL
    ELSE SUBSTRING_INDEX(first, ';', -1)
  END AS 'c'
FROM new;

答案 1 :(得分:0)

SQL Fiddle

MySQL 5.5.32架构设置

CREATE TABLE new
    (`first` varchar(12))
;

INSERT INTO new
    (`first`)
VALUES
    ('ae;b;c'),
    ('d;ee;f'),
    ('g;he'),
    ('ie')
;

查询1

SELECT 
  first,
  SUBSTRING_INDEX(first, ';', 1) AS 'a',
  CASE WHEN first LIKE '%;%;%' THEN 
            SUBSTRING_INDEX(SUBSTRING_INDEX(first, ';', 2), ';', -1) 
       WHEN first LIKE '%;%' THEN 
            SUBSTRING_INDEX(first, ';', -1)
       ELSE NULL END AS 'b',
  CASE WHEN first LIKE '%;%;%' THEN
            SUBSTRING_INDEX(first, ';', -1)
       ELSE NULL END AS 'c'
FROM new

<强> Results

|  FIRST |  A |      B |      C |
|--------|----|--------|--------|
| ae;b;c | ae |      b |      c |
| d;ee;f |  d |     ee |      f |
|   g;he |  g |     he | (null) |
|     ie | ie | (null) | (null) |

答案 2 :(得分:-1)

例如,您可以使用Arman P的this解决方案。

创建一个函数SPLIT_STRING,如链接所示,然后调用它:

先选择,SPLIT_STRING(首先,&#39 ;;&#39;,1)作为a,SPLIT_STRING(首先,&#39 ;;&#39;,2)为b,SPLIT_STRING(首先,&# 39 ;;&#39;,3)as c