登陆

如何使用SQLcoalesce与null整个获取的行

admin 2022-12-03 4人围观 ,发现0个评论

我试图解决的情况是:对于表中的每一行,可能存在来自第二个表的另一行,因此我需要来自第一个表的行的所有数据和来自第二个表的行的数据(如果存在).

我知道我可以使用数据结构作为主变量来收集表中一行的所有数据.所以,我的选择是这样的:

select     t1.*    ,t2.* into     :dst1    ,:dst2 from table1 t1   left join table2 t2 on t2.key=t1.key ; 

其中dst1和dst2分别是数据结构,如table1和table2记录的格式.很简单.

现在,重点是当第二个表中不存在该键的行时如何捕获空结果.在这种情况下,我希望初始化相应的数据结构,但是合并一次只能在一个字段上工作,而我无法找到另一个解决方案.

有没有办法获得这个结果?

任何帮助,将不胜感激!

谢谢



1> jmarkmurphy..:

解决这个问题的一种方法是使用指标变量.它看起来像这样:

dcl-ds hs    Qualified;   field1 ...   field2 ... endds;  dcl-s hsind  Int(5) Dim(2);  exec sql   select *     into :hs:hsind     from table     fetch first row only; 

注意,:hs和:hsind之间没有逗号(,),因为这是同一个变量赋值的一部分.:hsind是一个指示符变量,在这种情况下是一个Int(5)与主机数据结构具有相同元素数的数组:hs有字段.如果:hs中相关字段中的值为good,则指示符变量将包含0;如果为null,则指示符变量将包含-1.所以在我们上面的例子中:如果hs.field1是好的,而hs.field2是null,那么hsind(1)= 0,并且hsind(1)= -1.其他值表示其他内容,如数据映射错误(-2)或字符串截断(正数字符串的原始长度).

所以在你的例子中,使用这样的东西:

select     t1.*    ,t2.* into     :dst1:dst1ind    ,:dst2:dst2ind from table1 t1   left join table2 t2 on t2.key=t1.key ; 

dst1ind如果Int(5)具有与dst1子场相同数量的元素,则数组在哪里,类似于dst2ind.然后在您选择之后,只需检查dst2ind(1) >= 0,您就有了一个很好的选择.请注意,您需要确保select into只返回一行,否则您将收到相关错误.

请发表您的评论
请关注微信公众号
微信二维码
不容错过
Powered By Z-BlogPHP