【问题标题】:Talend - tmap - expression filter - how to filter against a list of valuesTalend - tmap - 表达式过滤器 - 如何过滤值列表
【发布时间】:2021-12-23 03:46:23
【问题描述】:

我有一个要过滤的值列表。由于此列表中的数字和内容是动态的,因此无法通过 .equals 处理静态查询。

我当前的过滤器是硬编码的:

row1.col1.equals("3810")||row1.col1.equals("3811")

我要使用的是更像 SQL 的语句:

row1.col1 in (listOfValues) 其中 ListOfValues 可以由变量或上下文给出。我找不到任何适合过滤列表的内容。

任何帮助将不胜感激

【问题讨论】:

  • 值 3810、3811 等存储在数据库中、全局变量中、上下文中?因为我猜你的要求需要通过 Talend Routine 传递。
  • 是的,这些值来自数据库。我将此逗号分隔的列表存储在一个全局变量中,以便在表达式过滤器中进一步使用。

标签: list filter expression talend tmap


【解决方案1】:

这个解决方案对我有用:

我编写了一个 java 帮助程序类,它将来自 row1 的输入值与存储在全局变量中的有效值列表进行比较。要与首先拆分和修剪的字符串进行比较以获取列表中的单个值。简短检查来自 row1 的给定输入值是否在此列表中,我使用了 .contains 方法。返回值(布尔值)将成为过滤与否的标准。

public class FileTransferBranchFilter {


    public static boolean contains(String checkMCU, String lovMCU) {
        
        /* lovMCU = list of valid MCUs in comma separated format
         * this list has to be splitted in single values for comparison
         * lpad with blanks to 12 digits is necessary for comparison 
         * of the MCU to be checked with the filter list*/
        
        String[] result = lovMCU.trim().split("\\s*,\\s*");
        List<String> lov = Arrays.asList(result);
        checkMCU = checkMCU.trim();
        
        
        
    //  System.out.println("eine Liste der gültigen MCUs" + Arrays.toString(result));
    //  System.out.println("die zu überprüfende MCU: " + checkMCU);
        
        if(lov.contains(checkMCU)) {
            //System.out.println("die zu überprüfende MCU befindet sich somit in der Liste der gültigen MCUs --> " + checkMCU);
            return true;
        }else {
            //System.out.println("die zu überprüfende MCU befindet sich somit nicht in der Liste der gültigen MCUs --> " + checkMCU);
            return false;
        }       
    }
}

这里是表达式生成器中的表达式:

【讨论】: