Talend - tmap - 表达式过滤器 - 如何过滤值列表
Posted
技术标签:
【中文标题】Talend - tmap - 表达式过滤器 - 如何过滤值列表【英文标题】:Talend - tmap - expression filter - how to filter against a list of values 【发布时间】: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 传递。 是的,这些值来自数据库。我将此逗号分隔的列表存储在一个全局变量中,以便在表达式过滤器中进一步使用。 【参考方案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;
这里是表达式生成器中的表达式:
【讨论】:
以上是关于Talend - tmap - 表达式过滤器 - 如何过滤值列表的主要内容,如果未能解决你的问题,请参考以下文章
使用 Talend 在 SQL Server 和 Postgres 之间转换日期
Talend Data Integration 中的选角日期