如果不存在,则选择"如果不存在"插入



>假设我有一个包含两列 b 和 c 的表 A。我想获取一个特定的值,如果它不存在,则将其初始化为零。像这样:

if  exists (select c from A where b=1) 
{return  (select c from A where b=1)}
else
{ (insert into A values(1,0)) return 0}

是否可以在一个语句中完成所有操作?

因此,您需要一个语句(或在更大的语句中使用的片段(,它将返回 c 的值,其中 b = 1,或者如果没有 b = 1 的行,则返回 0。是这样吗?

如果有几行 b = 1,你想返回什么?如果数据中可能的话,您的问题没有多大意义。因此,对于下面的答案,我假设b 列中可能没有重复项。(或者,准确地说,列 b 不必没有重复项;但值 1 必须在该列中出现不超过一次。

select nvl( (select c from A where b = 1), 0 ) from dual;

将返回单个值:如果表 A 中有一行 b = 1,它将返回相应的 c。如果没有 b = 1 的行,则"标量子查询"(内部 SELECT(将返回 NULL。如果第一个参数为 NULL,则 NVL 返回其第二个参数(否则返回第一个参数(。

现在,严格来说,这个解决方案不是100%正确的。如果表 A 中有一行,b = 1 并且 c 为 NULL,那么您可能希望返回 NULL,而不是 0。您需要澄清 c 是否可以为 NULL,如果可以,您希望如何处理它。(如果您也想在这种情况下返回 0,那么上面的解决方案是 100% 正确的。

我认为你可以做相反的事情,而不是检查是否为真,你可以检查是否不存在并插入

INSERT INTO A (F1, F2)
SELECT F1, F2 FROM C
WHERE NOT EXISTS (SELECT NULL FROM A WHERE A.F1 = C.F1)

这将在 A 中插入 B 中的值(如果它们在 A 中不存在(

最新更新