如何使用 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 一行,否则您将收到有关此的错误。
我要解决的情况是这样的:对于 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 一行,否则您将收到有关此的错误。