我尝试拆分字段(在某个分隔符处,在下面的示例中使用';')并将拆分的结果插入表中。我试图做的事情如下表所示。
注意: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或空字符串("" )。
任何人都有任何线索如何解决这个问题?
干杯
答案 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)
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