2017-04-17 51 views
0

我有一个表根据分隔符“|”将一列分成三列

id methods 
1 a|b|c 
2 e|f|g 

我怎样才能改变表

id method1 method2 method3 
1 a  b  c 
2 e  f  g 
+2

用你正在使用的数据库标记你的问题。 –

+1

这个_might_的答案取决于你正在使用的RDBMS。或者你想要一个“纯粹的”ANSI SQL答案? –

+2

修复您的架构,如果可以的话。将分隔数据存储在列中几乎从来都不是一个好主意,而且你找到了一个原因。 –

回答

1

不知道你所使用的RDBMS,但我得到这个在SQL Server,MySQL和SQLite的工作。这使得假设只有三个项目需要从字符串中拆分出来

重申@Joel Coehoorn提到的内容。给出大量数据时,这可能非常缓慢。最好是改变表的模式,并具有数据分离之前在表

SQL Server版本

select t.id, t.methods, 
SUBSTRING(t.methods, 1, CHARINDEX('|', t.methods)-1) as method1, 
SUBSTRING(t.methods, CHARINDEX('|', t.methods)+1, CHARINDEX('|', t.methods, CHARINDEX('|', t.methods)+1)-CHARINDEX('|', t.methods)-1) as method2, 
SUBSTRING(t.methods, CHARINDEX('|', t.methods, CHARINDEX('|', t.methods)+1)+1,len(t.methods)) as method3 
from TestTable t 

MySQL版本

select t.id, t.methods, 
SUBSTRING(t.methods, 1, LOCATE('|', t.methods)-1) as method1, 
SUBSTRING(t.methods, LOCATE('|', t.methods)+1, LOCATE('|', t.methods, LOCATE('|', t.methods)+1)-LOCATE('|', t.methods)-1) as method2, 
SUBSTRING(t.methods, LOCATE('|', t.methods, LOCATE('|', t.methods)+1)+1) as method3 
from TestTable t 

不断插入SQLite

select 
SUBSTR(t.methods, 1, INSTR(t.methods, '|')-1) as method1, 
SUBSTR(t.methods, INSTR(t.methods, '|')+1, INSTR(SUBSTR(t.methods, INSTR(t.methods, '|')+1), '|')-1) as method2, 
SUBSTR(t.methods, INSTR(SUBSTR(t.methods, INSTR(t.methods, '|')+1), '|')+ INSTR(t.methods, '|')+1) as method3 
from TestTable t