5

我在 esql (IBM Websphere Message Broker) 中有一个子流,我需要在其中实现类似于select distinct功能的东西。

一些背景:我在 Oracle 数据库中有一个表group_errcode_ref。该表几乎是ERROR_CODE和的固定链接/映射IDERROR_CODE是唯一的,但ID可以复制。例如,错误代码 4000 和 4001 都可以链接到 ID 1。

在我的 esql 子流中,我有一组错误代码,这些错误代码根据进入流的当前数据而变化。

所以我需要做的是我需要输入错误代码数组,并ID从我的表中为数组中的所有错误代码选择group_errcode_ref

我现在拥有的:

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

4

2 回答 2

2

如果您使用的是 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 是一个返回字符的函数,其中包含输入中的错误代码,为查询正确格式化,例如 (ec1, ec2, ...)

于 2016-02-04T06:31:49.160 回答
0

我的工作最终没有做选择不同或排序,而是另一个工作。

基本上,我遍历整个 ERROR_CODE 数组,然后查询与 error_code 对应的 ID,然后在将它们插入的表中选择 count(*)。

这仅适用于我的特定应用程序,因为我插入了 ID/问题对。

基本上它看起来像:

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;

这不是一个正确的答案,但它适用于我的特定应用程序。基本上循环遍历每个错误代码并一次选择一个,而不是发送整个数组。然后插入另一个数据库,同时避免另一个选择重复,看看它是否已经被插入。

我仍然会等待一周,看看是否有更好的答案并接受那个。


更新

我已经更改了我的代码以匹配 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;
于 2016-02-02T21:37:25.487 回答