【问题标题】:Informatica Lookup String Pattern MatchingInformatica 查找字符串模式匹配
【发布时间】:2020-08-21 20:42:00
【问题描述】:

我有一个仅包含 2 列的查找表(从用户平面文件加载),一列是连接列,另一列是所需的输出。

我的源数据列 A 的示例数据如下:

999-55555-000-400-9999

800-22222-123-777-2233

等等... 500K 记录。

现在查找表如下:

B 列 || C栏

999-X-000-400-X ||约翰

X-22222-X-777-X ||史密斯

要求是如果源列 A 数据与查找表的 B 列数据的格式匹配,它将返回 C 列的值作为输出。

我如何通过 LKP 和表达式转换来实现这一点(不使用 Java,因为我不太熟悉它)。如果 LKP 表需要在我从那里的平面文件加载数据时可以添加的其他列。如果有人可以提供帮助,将不胜感激?

【问题讨论】:

  • 您是否在 ColumnA 和 lkp.ColumnB 中寻找匹配的格式?而不是数据。在您的示例中, lkp 应该返回哪些值 - 第 1 行应该返回 John,因为 lkp 包含 999-X-000-400-X - 其中只有 999-、-000-400 这两个子字符串匹配?如果 colA 有像“999-ABC”这样的数据怎么办?匹配吗?所以它类似于模式匹配,但不完全是模式匹配。我们可能必须先拆分,然后再进行模式匹配。

标签: lookup data-warehouse informatica informatica-powercenter


【解决方案1】:

您只需将 B 列和 A 列标记为查找转换中的查找端口,将 C 列标记为输出端口。

这就是你需要做的。请记住,查找转换作为数据集的左外连接工作。因此,如果 columnA 中的值与 ColumnB 匹配,则 ColumnC 将被返回,否则您将得到 null。

【讨论】:

  • 感谢 Divyaansh,但我的问题是 LKP 没有 LIKE 运算符供我使用。我的输入数据是一个完整的字符串,所有数字由连字符分隔,如下所示: 111-222-333-444-555 但我的查找列 B 将包含类似 111-X-222-333-X 的数据。那么如何让我的 Source 字段与 LKP 数据模式相匹配,其中数据将以 X 代替实际数字。
  • 您可以在 SQ 转换或表达式中使用 regexp_replace 将源数据转换为 ff(查找数据)中存在的数据。
  • 您可以在 SQ 转换或表达式中使用 regexp_replace 将源数据转换为 ff(查找数据)中存在的数据。
【解决方案2】:

我相信您可以通过准备一些数据来实现此搜索。字段拆分后,您将不需要LIKE 运算符,而只需对子字段进行精确匹配。

对于查找数据,将 B 列更改为 5 列:

B1 || B2  || B3  || B4  || B5 || Column C
999 || X || 000 || 400 || X || John
X || 22222 || X || 777 || X || Smith

对于输入数据,进行类似的拆分:

IN1 || IN2 || IN3 || IN4 || IN5
999 || 55555 || 000 || 400 || 9999
800 || 22222 || 123 || 777 || 2233

现在您将不得不使用... 5 次查找,每个子字段之一

Lkp1
Condition : IN1 = B1
Output : Match1_B1, Match1_B2, Match1_B3, Match1_B4, Match1_B5, Match1_Column_C

Lkp2
Condition : IN2 = B2
Output : Match2_B1, Match2_B2, Match2_B3, Match2_B4, Match2_B5, Match2_Column_C

以此类推到 5

第一行你会得到:

Match1_B1 : 999
Match1_B2 : X
Match1_B3 : 000
Match1_B4 : 400
Match1_B5 : X
Match1_Column_C : John
Match2_B1 : NULL
Match2_B2 : NULL 
Match2_B3 : NULL
Match2_B4 : NULL
Match2_B5 : NULL
Match2_Column_C : NULL
Match3_B1 : 999
Match3_B2 : X
Match3_B3 : 000
Match3_B4 : 400
Match3_B5 : X
Match3_Column_C : John
Match4_B1 : 999
Match4_B2 : X
Match4_B3 : 000
Match4_B4 : 400
Match4_B5 : X
Match4_Column_C : John
Match5_B1 : NULL
Match5_B2 : NULL 
Match5_B3 : NULL
Match5_B4 : NULL
Match5_B5 : NULL
Match5_Column_C : NULL

现在在表达式中链接所有查找并检查子字段是否匹配:

IIF( (ISNULL(Match1_B1) OR Match1_B1 != 'X')
AND (ISNULL(Match2_B2) OR Match2_B2 != 'X')
AND (ISNULL(Match3_B3) OR Match3_B3 != 'X')
AND (ISNULL(Match4_B4) OR Match4_B4 != 'X')
AND (ISNULL(Match5_B5) OR Match5_B5 != 'X'),
    IIF(ISNULL(Match1_Column_C),
        IIF(ISNULL(Match2_Column_C),
            IIF(ISNULL(Match3_Column_C),
                IIF(ISNULL(Match4_Column_C),
                    Match5_Column_C,
                    Match4_Column_C
                ),
                Match3_Column_C
            ),
            Match2_Column_C
        ),
        Match1_Column_C
    )
)            

我希望这应该接近你想要的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2014-05-07
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多