我正在尝试根据错误情况使用不同的错误代码更新同一列。
更新条件(单独):
UPDATE MEM_SRC_EXTN
SET INT_VALUE_1 =100
WHERE ISNULL(TYPE_VALUE,'') =''
OR ISNULL(TYPE,'') =''
OR ISNULL(VALUE_1,'') =''
OR ISNULL(VALUE_2,'') ='';
UPDATE MEM_SRC_EXTN EXTN
SET INT_VALUE_1=222
WHERE NOT EXISTS
(SELECT 1
FROM CMC_MEM_SRC SRC
WHERE EXTN.TYPE_VALUE = SRC.TN_ID);
UPDATE MEM_SRC_EXTN
SET INT_VALUE_1=333
GROUP BY TYPE_VALUE
HAVING COUNT(VALUE_1)>1;
由于我必须根据条件将这3个更新条件归为一个,因此它首先检查条件然后更新列值,而不是每次都触发所有3个更新语句。
我想出了这个解决方案,但不确定这是否有效?
UPDATE MEM_SRC_EXTN EXTN
SET INT_VALUE_1 = CASE
WHEN (ISNULL(TYPE_VALUE,'') ='' OR ISNULL(TYPE,'') ='' OR ISNULL(VALUE_1,'') =''OR ISNULL(VALUE_2,'') ='')
THEN 100
WHEN NOT EXISTS (SELECT 1 FROM CMC_MEM_SRC SRC WHERE EXTN.TYPE_VALUE = SRC.TN_ID)
THEN 222
WHEN GROUP BY TYPE_VALUE HAVING COUNT(VALUE_1)>1
THEN 333
ELSE 000
END
答案 0 :(得分:0)
首先,您应该使用正确的声明顺序。如果WHEN GROUP BY TYPE_VALUE HAVING COUNT(VALUE_1)>1
是最后一次,那么万一它应该是第一个。
除此之外你不能写WHEN GROUP BY TYPE_VALUE HAVING COUNT(VALUE_1)>1
。
orcle中的= ''
与= null
相同并不是真的,并且false false不是null
您可以将其重写为子查询
UPDATE MEM_SRC_EXTN EXTN
SET INT_VALUE_1 = CASE
WHEN exists (SELECT NULL
FROM MEM_SRC_EXTN sub_extn
WHERE sub_extn.TYPE_VALUE = EXTN.TYPE_VALUE
OR (sub_extn.TYPE_VALUE is NULL AND EXTN.TYPE_VALUE IS NULL)
GROUP BY TYPE_VALUE
HAVING COUNT(VALUE_1)>1)
THEN 333
WHEN NOT EXISTS (SELECT 1
FROM CMC_MEM_SRC SRC
WHERE EXTN.TYPE_VALUE = SRC.TN_ID)
THEN 222
WHEN TYPE_VALUE is null OR TYPE is null OR VALUE_1 is null OR VALUE_2 is null
THEN 100
ELSE 000
END
但是这个查询很有用,可能你可能会使用别的东西。请考虑merge
答案 1 :(得分:0)
我会考虑一个MERGE
声明。像这样:
MERGE INTO mem_src_extn t USING
(
SELECT mse.rowid row_id,
CASE WHEN mse.type_value IS NULL OR mse."TYPE" IS NULL OR mse.VALUE_1 IS NULL or mse.VALUE_2 IS NULL THEN 100
WHEN ( SELECT count(*) FROM cmc_mem_src cms WHERE cms.tn_id = mse.type_value ) = 0 THEN 222
WHEN count(mse.value_1) over ( partition by type_value ) > 1 THEN 333
ELSE '000' int_value_1
FROM mem_src_extn mse
) u
ON ( t.rowid = u.row_id )
WHEN MATCHED THEN UPDATE SET t.int_value_1 = u.int_value_1 WHERE u.inv_value_1 != '000';
MERGE
语句为开发人员带来了额外的好处 - 您只需运行SELECT
部分语句即可查看结果。这使得调试变得更容易。
另请注意,您原来的UPDATE
语句不会更新任何内容000
,但您建议的解决方案会。因此,目前尚不清楚您的要求是什么。由于000
的{{1}}子句中的WHERE
子句,我的解决方案不会向UPDATE
更新任何内容。如果要将不满足上述三个条件中任何一个的行设置为MERGE
,则可以删除它。