2017-04-17 158 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