如何使用 SQL 与空的整个提取行合并

How to use SQL coalesce with a null whole fetched row

我要解决的情况是这样的:对于 table 中的每一行,第二个 table 中的另一行可能存在,所以我需要第一个 [=] 行中的所有数据=27=] 和第二行 table 中的数据(如果存在)。

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

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

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

现在,重点是当第二个 table 中不存在该键的行时如何捕获空结果。在那种情况下,我想初始化相应的数据结构,但 coalesce 一次只在一个字段上工作,我一直无法找到另一种解决方案。

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

如有任何帮助,我们将不胜感激!

谢谢

处理这个问题的一种方法是使用指示变量。它看起来像这样:

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 中关联字段中的值是好的,则指示器变量将包含 0,如果为空,则为 -1。所以在我们上面的例子中:如果 hs.field1 是好的,并且 hs.field2 是空的,那么 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。然后在你的 selection 之后,只需检查 dst2ind(1) >= 0,你就有了一个很好的 select。请注意,您需要确保 select into 仅 returns 一行,否则您将收到有关此的错误。