Sql 根据分隔符“|”将一列拆分为三列

Sql 根据分隔符“|”将一列拆分为三列,sql,substring,Sql,Substring,我有一张桌子 id methods 1 a|b|c 2 e|f|g 我怎样才能把桌子换成白色 id method1 method2 method3 1 a b c 2 e f g 不确定您使用的是哪种RDBMS,但我在Sql Server、MySql和SQLite中使用了它。这使得假设只有三个项需要从字符串中拆分出来 重申@Joel Coehoorn提到的内容。当提供大量数据时,这可能非常缓慢。最好是更改表的模式,并在将数

我有一张桌子

id  methods
1   a|b|c
2   e|f|g
我怎样才能把桌子换成白色

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

不确定您使用的是哪种RDBMS,但我在Sql Server、MySql和SQLite中使用了它。这使得假设只有三个项需要从字符串中拆分出来

重申@Joel Coehoorn提到的内容。当提供大量数据时,这可能非常缓慢。最好是更改表的模式,并在将数据插入表之前将其拆分

SQL Server版本

MySql版本

SQLite


用您正在使用的数据库标记您的问题。答案可能取决于您正在使用的RDBMS。或者您想要一个纯ANSI SQL答案?如果可以,请修复您的模式。将带分隔符的数据存储在列中几乎从来都不是一个好主意,您正在找到一个原因。
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
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
 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