我需要一个SQL语句,允许我将描述列拆分为4列
该描述使用'='
的分隔符来保存以下内容Mary=123=456=payment
这需要分为以下几部分:
Claimant Voucher _no Rec_NO descr
Mary 123 456 payment
答案 0 :(得分:2)
SQL语言不用于计算目的。使用更高级别(编程语言,ORM)以获得更高的速度。您的RDBMS应该支持子查询,字符串函数(SUBSTRING,LOCATE)。以下代码在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有类似的构造。