我需要一个sql语句,允许我将描述列拆分为4列

时间:2012-05-16 04:28:05

标签: sql

我需要一个SQL语句,允许我将描述列拆分为4列

该描述使用'='

的分隔符来保存以下内容
Mary=123=456=payment

这需要分为以下几部分:

Claimant   Voucher _no   Rec_NO   descr  
Mary       123           456      payment

3 个答案:

答案 0 :(得分:2)

SQL语言不用于计算目的。使用更高级别(编程语言,ORM)以获得更高的速度。您的RDBMS应该支持子查询,字符串函数(SUBSTRINGLOCATE)。以下代码在MySQL

http://www.sqlfiddle.com/#!2/ec808/26

CREATE TABLE Table1(
data varchar(2000)
)

INSERT INTO Table1(data) values('Mary=123=456=payment');
INSERT INTO Table1(data) values('Mary232=123=456=payment');
SELECT SUBSTRING(data, 1,pos1-1) as Claimant       ,
SUBSTRING(data, pos1+1,pos2-pos1-1) as Voucher_no,
SUBSTRING(data, pos2+1,pos3-pos2-1) as Rec_NO,
SUBSTRING(data, pos3+1) as descr FROM (
 SELECT 

data,
LOCATE('=',`data`) as pos1,
LOCATE('=',`data`,LOCATE('=',`data`)+1) as pos2,
LOCATE('=',`data`,LOCATE('=',`data`,LOCATE('=',`data`)+1)+1) as pos3
FROM table1) as subq;

答案 1 :(得分:2)

许多RDBMS本身或通过扩展为您提供正则表达式函数。当我来自PostgresSQL世界并且您没有指定您正在使用的RDBMS时,我将举例说明如何在PostgreSQL中执行此操作。

您可以使用regexp_split_to_table()功能来实现此目的:

SELECT entry
  FROM regexp_split_to_table('Mary=123=456=payment', '=') AS t(entry);

您可以检查SQL Fiddle上的输出。

答案 2 :(得分:0)

在Oracle上你必须使用

select substr(description, 1, instr(description, '=') - 1) part1,
   substr(description, instr(description, '=') + 1,
                       instr(description, '=', 1, 2) - instr(description, '=') - 1) part2,
   substr(description, instr(description, '=', 1, 2) + 1,
                       instr(description, '=', 1, 3) - instr(description, '=', 1, 2) - 1) part3,
   substr(description, instr(description, '=', 1, 3) + 1) part4
from your_table;

MySQL有类似的构造。