oracle如果不存在则选择插入

iyfjxgzm  于 2022-11-03  发布在  Oracle
关注(0)|答案(2)|浏览(225)

假设我有一个表A,它有两列b和c。我想获取一个特定的值,如果它不存在,就用零初始化它。类似于:

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}

有没有可能在一次陈述中完成所有这些?

dgiusagp

dgiusagp1#

因此,您需要一个语句(或一个用于更大的语句的片段),它将返回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%正确的。)

unftdfkk

unftdfkk2#

我想你可以反其道而行之,不检查是否为真,而是检查是否不存在,然后插入

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中不存在)

相关问题