ESQL 用于将字符串拆分为多个值

问题描述 投票:0回答:3

以下输入 xml 字段需要按 6 个字符进行子字符串化,并且每 6 个字符应拆分并保存在输出的选项字段中。

Input: 
<feature>124414500045563879</feature>

output:
<option>124414</option>
<option>500045</option>
<option>563879</option>

IIB ESQL 中是否有可用的 tokenizer 函数来实现上述结果。

messagebroker ibm-integration-bus extended-sql
3个回答
7
投票

据我所知,ESQL 中没有 String Tokenizer 函数。

但是您可以使用以下过程作为基础来实现您的目标。该方法将 Delim 上的 S 拆分为 Env 中的数组(Environment.Split.Array[]) 并在重新填充之前删除Environment.Split。

在您的情况下,您不需要 Delim,您应该在子字符串部分使用固定长度。

CREATE PROCEDURE Split (IN S CHARACTER, IN Env REFERENCE, IN Delim CHARACTER) 
BEGIN 
   DECLARE P INTEGER; 
   DECLARE Idx INTEGER 1; 

   SET Env.Split = NULL; 

   REPEAT 
      SET P = POSITION(Delim IN S); 
      IF P = 0 THEN 
         SET Env.Split.Array[Idx] = S; 
      ELSE 
         SET Env.Split.Array[Idx] = LEFT(S, P - 1); 
         SET S = SUBSTRING(S FROM P + LENGTH(Delim)); 
         SET Idx = Idx + 1; 
      END IF; 
  UNTIL P = 0    
  END REPEAT;    
END;

来源:http://www.mqseries.net/phpBB2/viewtopic.php?p=97845&


1
投票

另一种解决方案可能是将特征值作为比特流,从中构建新的 BLOB 消息,并使用描述该值中令牌的消息定义重新解析它。重新解析后,就可以进一步处理新的逻辑消息了。


0
投票

ESQL 中没有内置的 split 函数。然而,人们可以在 ESQL 中创建自己的 split 函数。您可以使用以下过程根据 delemeter 拆分字符串并将其存储在数组中。

CREATE FUNCTION split(string CHARACTER, delimiter CHARACTER, IN result REFERENCE)
BEGIN
    DECLARE index INTEGER 1;
    WHILE SUBSTRING(string BEFORE delimiter) <> '' DO
        EVAL('SET result.index[' || CAST(index AS CHARACTER) || ']=''' || SUBSTRING(string BEFORE delimiter) || '''');
        SET index = index + 1;
        SET string = SUBSTRING(string AFTER delimiter);
    END WHILE;
    EVAL('SET result.index[' || CAST(index AS CHARACTER) || ']=''' || string || '''');
END;
© www.soinside.com 2019 - 2024. All rights reserved.