【发布时间】:2017-03-13 14:46:05
【问题描述】:
我正在尝试根据错误情况使用不同的错误代码更新同一列。
更新条件(单独):
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
【问题讨论】:
-
这确实是正确的做法。如果由于某种原因无法正常工作,请对其进行测试并写回。
-
Oracle 中没有
isnull函数,请改用coalesce或nvl- 请参阅stackoverflow.com/questions/3523036/… -
此外,空字符串在 Oracle 中被视为
NULL。因此,如果TYPE_VALUE是NULL,则NVL(TYPE_VALUE,'') = ''将是FALSE。我希望你想要NVL(TYPE_VALUE,'#NULL#') = '#NULL#'或类似的东西,其中'#NULL#' 是一些不能是TYPE_VALUE的实际值的通用字符串。 -
还有
WHEN GROUP BY...这根本不对。这个问题需要有人来回答。
标签: oracle