将一个列值拆分为多个列 - 存储过程

时间:2013-09-19 17:55:49

标签: sql oracle stored-procedures

我有一个名为product的表,其中包含一个名为'Description'的列。 description列的值将类似于

'NAME:ITEM1;COST:20;QUANTITY:23;'
'NAME:ITEM2;COST:20;QUANTITY:23;'
'NAME:ITEM4;COST:24;QUANTITY:24;'
'NAME:ITEM6;COST:26;QUANTITY:25;'
'NAME:ITEM3;COST:27;QUANTITY:27;'

现在我有另一个名为PRODUCT_DETAILS的表,它有三列NAMECOSTQUANTITY

我必须将值除以':',';'并将值单独提取到PRODUCT_DETAILS表中。

我应该使用存储过程来执行此操作。请帮我解决这个问题,因为我在SQL中只编写了简单的查询和存储过程

2 个答案:

答案 0 :(得分:1)

您不需要存储过程。如您所知,描述格式可以轻松选择值并将其插入product_details:


insert into product_details
(name, cost, quantity)
select 
  substr(description, instr(description, ':', 1, 1) + 1, instr(description, ';', 1, 1) - instr(description, ':', 1, 1) - 1) as name,
  to_number(substr(description, instr(description, ':', 1, 2) + 1, instr(description, ';', 1, 2) - instr(description, ':', 1, 2) - 1)) as cost,
  to_number(substr(description, instr(description, ':', 1, 3) + 1, instr(description, ';', 1, 3) - instr(description, ':', 1, 3) - 1)) as quantity
from product;

当然你也可以写一个包含语句的程序:


create or replace procedure product_to_product_details is
begin
  insert into product_details
  (name, cost, quantity)
  select 
    substr(description, instr(description, ':', 1, 1) + 1, instr(description, ';', 1, 1) - instr(description, ':', 1, 1) - 1) as name,
    to_number(substr(description, instr(description, ':', 1, 2) + 1, instr(description, ';', 1, 2) - instr(description, ':', 1, 2) - 1)) as cost,
    to_number(substr(description, instr(description, ':', 1, 3) + 1, instr(description, ';', 1, 3) - instr(description, ':', 1, 3) - 1)) as quantity
  from product;
end;

答案 1 :(得分:0)

以下是一个示例查询,可帮助您拆分数据:

SELECT REGEXP_REPLACE(str,'.*NAME:([^;]+);.*','\1') AS name
  ,REGEXP_REPLACE(str,'.*COST:([^;]+);.*','\1') AS cost
  ,REGEXP_REPLACE(str,'.*QUANTITY:([^;]+);.*','\1') AS quantity
FROM SplitStringTest;

这是一个Fiddle来演示。正则表达式是一种非常方便的工具。

以下是一些参考资料:

Regex tutorial

Oracle docs