假设我有一个表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}
有没有可能在一次陈述中完成所有这些?
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%正确的。)
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中不存在)
2条答案
按热度按时间dgiusagp1#
因此,您需要一个语句(或一个用于更大的语句的片段),它将返回c的值,其中b = 1,或者如果没有b = 1的行,则返回0。是这样吗?
如果有几行B = 1,您希望返回什么?如果在您的数据中可能存在这样的情况,您的问题没有多大意义。因此,对于下面的答案,我假设列b中可能没有重复项。(或者,确切地说,列b没有重复项是不必要的;但是值1在该列中出现的次数不超过一次是必需的。)
将返回单个值:如果表A中有一行b = 1,它将返回相应的c。如果没有b = 1的行,“标量子查询”(内部SELECT)将返回NULL。如果第一个参数为NULL,NVL将返回其第二个参数(否则,它将返回第一个参数)。
现在,严格地说,这个解决方案不是100%正确的。如果表A中有一行,b = 1,c为NULL,那么您可能希望返回NULL,而不是0。您需要澄清c是否可以为NULL,如果可以,您希望如何处理。(如果在这种情况下您也希望返回0,那么上面的解决方案是100%正确的。)
unftdfkk2#
我想你可以反其道而行之,不检查是否为真,而是检查是否不存在,然后插入
这将在A中插入来自B的值(如果它们在A中不存在)