假设我有一个包含两列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}
是否可以在一条语句中完成全部操作?
答案 0 :(得分:1)
因此,您想要一个语句(或在更大的语句中使用的片段),该语句将返回c的值,其中b = 1,或者如果没有行等于b = 1,则返回0。
如果有几行,其中b = 1,您想返回什么?如果您的数据中有可能,那么您的问题就没有多大意义了。因此,对于以下答案,我认为b列中可能没有没有重复内容。 (或者,确切地说,b列没有重复是没有必要的;但是 很有必要使值1在该列中出现不超过一次。)
Presto
将返回一个值:如果表A中有一行,其中b = 1,它将返回对应的c。如果没有b = 1的行,则“标量子查询”(内部SELECT)将返回NULL。如果第一个参数为NULL,则NVL返回其第二个参数(否则它将返回第一个参数)。
现在,严格来说,此解决方案不是100%正确的。如果表A中有一行,且b = 1并且c为NULL,那么也许您想返回NULL,而不是0。您将需要弄清楚c是否可以为NULL,如果可以的话,您将如何处理。 (如果您也想在这种情况下返回0,则上述解决方案是100%正确的。)