Sql oracle选择(如果不存在)插入

Sql oracle选择(如果不存在)插入,sql,oracle,select,insert,Sql,Oracle,Select,Insert,假设我有一个表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} 是否可以在一条语句中完成所有操作?因此,您需要一条语句(或在更大的语句中使用的片段),该语句将返回c值,其中b=1,或者如果没有b=1的行,则返回0。是这样吗 如

假设我有一个表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}
是否可以在一条语句中完成所有操作?

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

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

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


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

单个SQL语句要么返回行,要么修改数据。它通常不会同时做这两件事。@GordonLinoff-我不认为OP希望插入到表中;他仍然只对IF语句的ELSE分支中的返回值0感兴趣。很明显,OP也希望插入(请参见他在我的答案下的注释)。您的解决方案遗漏了插入部分,因为如果数据不存在,我希望插入数据。关于你的问题,我确信b=1的几行是不可能的。另外,c永远不会为空。@ayyoobimani-好的,那么Gordon Linoff的猜测是对的,您实际上想同时做两件事:在两种情况下都选择(某物),如果表中不存在b=1,您想插入到表中吗?这需要两个步骤;您可以先执行INSERT(但仅当b=1不在表中时),然后执行SELECT-不再需要任何条件,因为您已经知道将存在b=1的行(除非另一个会话在您放入该行后立即将其删除)。只需添加-确保“b”是该表中的主键/唯一键,否则,“如果不存在则插入”的概念通常在现实环境中失败(即,多个用户)
select nvl( (select c from A where b = 1), 0 ) from dual;