如何在 esql 中 select distinct?
How to select distinct in esql?
我在 esql (IBM Websphere Message Broker) 中有一个子流,我需要在其中实现类似于 select distinct
功能的东西。
一些背景:我在 Oracle 数据库 group_errcode_ref
中有一个 table。 table 几乎是 ERROR_CODE
和 ID
的固定 link/mapping。 ERROR_CODE
是唯一的,但 ID
可以重复。例如,错误代码 4000 和 4001 都可以链接到 ID 1。
在我的 esql 子流中,我有一组错误代码,这些代码根据进入流的当前数据而变化。
所以我需要做的是我需要获取输入错误代码数组,并且 select ID
来自我的 table [数组中所有错误代码的 ID
=13=]
我现在拥有的:
declare db rows;
set db.rows[] = (select d.ID from Database.group_errcode_ref as d where d.ERROR_CODE in (select D from errCodes.Code[] as D);
errCodes
是输入的错误代码数组。 row
是错误码对应的所有ID的数组。
很好,但我想从 db.rows[]
数组中删除重复项。
我不确定在 esql 中执行此操作的最佳方法,但它不支持 distinct
。 group by
,或order by
我的变通办法最终没有进行 select 区分或排序,而是另一种变通办法。
基本上我遍历了ERROR_CODEs的整个数组,然后我查询对应于error_code的ID,然后我select count(*)在table 我把它们插入到.
这仅适用于我的特定应用程序,因为我插入了 ID/Issue 对。
基本上是这样的:
for x as errs.Error[] do
declare db row;
set db.rows[] = passthru('select ID from my_static_map_table where error_code = ?;' values(x.Code));
declare db2 row;
set db2.rows[] = passthru('select count(*) from my_table_2 where guid = ? and id = ?;' values(guid, db.ID));
if db2.COUNT == 0 then
-- Here I do an insert into my_table_2 with ID and a few other values
end if;
end for;
这不是一个正确的答案,但它适用于我的特定应用程序。基本上循环遍历每个错误代码和 select 一次一个,而不是发送整个数组。然后插入另一个数据库,同时避免另一个数据库重复 select 以查看它是否已被插入。
我还会再等一周,看看是否有更好的答案并接受那个。
更新
我更改了我的代码以匹配 Attila 的解决方案 - 这要好得多,也是我最初寻找的东西
我唯一要添加的是格式化错误代码的函数 - 这非常简单:
create function FlattenErrorCodesArray(in err row) returns char begin
declare idx int 1;
declare ret char;
for x as errs.Error[] do
if idx = 1 then
set ret = '(' || cast(x.Code as char);
else
set ret = ret || ',' || cast(x.Code as char);
end if;
set idx = idx + 1;
end for;
set ret = ret || ')';
end;
如果您使用的是 PASSTHRU 语句,那么您的数据库管理器的所有功能都受支持,因此也很独特。
你唯一需要克服的是你不能在 PASSTHRU 中直接混合数据库和消息树查询,你传递给它的所有东西都会直接进入数据库。
因此您的原始解决方案如下所示:
set db.rows[] = PASSTHRU 'select distinct d.ID from SCHEMA.group_errcode_ref as d where d.ERROR_CODE in ' || getErrorCodesFromInput(errCodes) TO Database.DSN1;
这里的 getErrorCodesFromInput 是一个 returns 字符的函数,它包含您输入中的错误代码,并针对查询正确格式化,例如(ec1, ec2, ...)
我在 esql (IBM Websphere Message Broker) 中有一个子流,我需要在其中实现类似于 select distinct
功能的东西。
一些背景:我在 Oracle 数据库 group_errcode_ref
中有一个 table。 table 几乎是 ERROR_CODE
和 ID
的固定 link/mapping。 ERROR_CODE
是唯一的,但 ID
可以重复。例如,错误代码 4000 和 4001 都可以链接到 ID 1。
在我的 esql 子流中,我有一组错误代码,这些代码根据进入流的当前数据而变化。
所以我需要做的是我需要获取输入错误代码数组,并且 select ID
来自我的 table [数组中所有错误代码的 ID
=13=]
我现在拥有的:
declare db rows;
set db.rows[] = (select d.ID from Database.group_errcode_ref as d where d.ERROR_CODE in (select D from errCodes.Code[] as D);
errCodes
是输入的错误代码数组。 row
是错误码对应的所有ID的数组。
很好,但我想从 db.rows[]
数组中删除重复项。
我不确定在 esql 中执行此操作的最佳方法,但它不支持 distinct
。 group by
,或order by
我的变通办法最终没有进行 select 区分或排序,而是另一种变通办法。
基本上我遍历了ERROR_CODEs的整个数组,然后我查询对应于error_code的ID,然后我select count(*)在table 我把它们插入到.
这仅适用于我的特定应用程序,因为我插入了 ID/Issue 对。
基本上是这样的:
for x as errs.Error[] do
declare db row;
set db.rows[] = passthru('select ID from my_static_map_table where error_code = ?;' values(x.Code));
declare db2 row;
set db2.rows[] = passthru('select count(*) from my_table_2 where guid = ? and id = ?;' values(guid, db.ID));
if db2.COUNT == 0 then
-- Here I do an insert into my_table_2 with ID and a few other values
end if;
end for;
这不是一个正确的答案,但它适用于我的特定应用程序。基本上循环遍历每个错误代码和 select 一次一个,而不是发送整个数组。然后插入另一个数据库,同时避免另一个数据库重复 select 以查看它是否已被插入。
我还会再等一周,看看是否有更好的答案并接受那个。
更新
我更改了我的代码以匹配 Attila 的解决方案 - 这要好得多,也是我最初寻找的东西
我唯一要添加的是格式化错误代码的函数 - 这非常简单:
create function FlattenErrorCodesArray(in err row) returns char begin
declare idx int 1;
declare ret char;
for x as errs.Error[] do
if idx = 1 then
set ret = '(' || cast(x.Code as char);
else
set ret = ret || ',' || cast(x.Code as char);
end if;
set idx = idx + 1;
end for;
set ret = ret || ')';
end;
如果您使用的是 PASSTHRU 语句,那么您的数据库管理器的所有功能都受支持,因此也很独特。
你唯一需要克服的是你不能在 PASSTHRU 中直接混合数据库和消息树查询,你传递给它的所有东西都会直接进入数据库。
因此您的原始解决方案如下所示:
set db.rows[] = PASSTHRU 'select distinct d.ID from SCHEMA.group_errcode_ref as d where d.ERROR_CODE in ' || getErrorCodesFromInput(errCodes) TO Database.DSN1;
这里的 getErrorCodesFromInput 是一个 returns 字符的函数,它包含您输入中的错误代码,并针对查询正确格式化,例如(ec1, ec2, ...)