我编写了一个Oracle数据库转换脚本,它将数据从以前的单个表传输到带有主表和多个子/引用/维护表的新数据库中。当然,这种更标准化的布局(以前可能有Bob/Storage Room/Ceiling
作为[Location]
值)具有比旧表更多的字段,因此无法完全转换。
目前,我已在每个子表中插入了一个记录值(例如{}} [NO_CONVERSION_DATA]
。对于我的主表,我需要将(例如)[Color_ID]
设置为22,[Type_ID]
设置为57,因为这些新字段没有显式转换(每年,所有这些记录都会更新,之后下一次更新所有记录都将存在正确的字段值,因此占位符值/记录[NO_CONVERSION_DATA]
将从子表中删除。
我同样需要设置[Status_Id]
类似以下内容(不工作):
INSERT INTO TABLE1 (STATUS_ID)
VALUES
-- Status was not set as Recycled, Disposed, etc. during Conversion
IF STATUS_ID IS NULL THEN
(CASE
-- [Owner] field has a value, set ID to 2 (Assigned)
WHEN RTRIM(LTRIM(OWNER)) IS NOT NULL THEN 2
-- [Owner] field has no value, set ID to 1 (Available)
WHEN RTRIM(LTRIM(OWNER)) IS NULL THEN 1
END as Status)
任何人都可以更熟悉Oracle& PL / SQL协助我在这里尝试做什么的语法/布局?
好的,我想出了如何将2个特定列设置为所有行的相同值:
UPDATE TABLE1
SET COLOR_ID = 24;
UPDATE INV_ASSETSTEST
SET TYPE_ID = 20;
我仍然试图根据STATUS_ID
字段[OWNER]
中的值设置NULL/NOT NULL
。下面的Coco的解决方案看起来很擅长(关于他的评论,而不是发布的解决方案本身),但是下面导致我的NON-NULLABLE
列中的每一个都被标记并且语句将不会执行:
INSERT INTO TABLE1(STATUS_ID)
SELECT CASE
WHEN STATUS_ID IS NULL THEN
CASE
WHEN TRIM(OWNER) IS NULL THEN 1
WHEN TRIM(OWNER) IS NOT NULL THEN 2
END
END FROM TABLE1;
我试过拼凑一个类似的UPDATE
声明,但到目前为止还没有运气。
答案 0 :(得分:0)
试试这个
INSERT INTO TABLE1 (STATUS_ID)
VALUES
(
case
when TATUS_ID IS NULL THEN
(CASE
-- [Owner] field has a value, set ID to 2 (Assigned)
WHEN RTRIM(LTRIM(OWNER)) IS NOT NULL THEN 2
-- [Owner] field has no value, set ID to 1 (Available)
WHEN RTRIM(LTRIM(OWNER)) IS NULL THEN 1
END )
end);