我有一个名为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
的表,它有三列NAME
,COST
,QUANTITY
。
我必须将值除以':',';'
并将值单独提取到PRODUCT_DETAILS
表中。
我应该使用存储过程来执行此操作。请帮我解决这个问题,因为我在SQL中只编写了简单的查询和存储过程
答案 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来演示。正则表达式是一种非常方便的工具。
以下是一些参考资料: