【问题标题】:pentaho spoon : how to insert value to column conditionnally?pentaho 勺子:如何有条件地向列插入值?
【发布时间】:2019-06-26 18:33:09
【问题描述】:

所以在我的表中,我有一个列quantitycomment。 如果quantity 中的值大于0,那么我需要在comment 列中插入一个字符串“available”,如果它等于0,那么“to order”,最后如果它小于0,那么“warning” .最好的方法是什么?

编辑: 猜猜我上面的问题并没有显示出所有必要的工作。

首先,我有一个文本文件,其中包含quantity 等字段。

然后我对数据进行一些修改(在公式步骤中,我对quantity 进行了一些计算)。

最后我使用Table output 步骤将它们插入BD。要插入的字段之一是quantity

我的主要问题是:

Table output 步骤之后(当quantity 已经添加到BD 中时)使用SQL 脚本步骤向comment 列插入值是否更好?

【问题讨论】:

    标签: pentaho pentaho-spoon


    【解决方案1】:

    你基本上有3个选择:

    1. 过滤行步骤根据数量的值拆分流,然后每个输出流都有一个添加常量步骤来添加所需的新字段,然后通过连接两个添加常量步骤再次组合它们假人;

    2. 用户定义的 java 表达式

    3. 一个 JavaScript 步骤。

    选项 2 可能是最干净的;选项 3 与选项 2 基本相同,只是用 javascript 代替了 java 代码;选项 1 的优点是不需要任何代码(虽然,因为替代方案是单行,不是真正的问题)。另外,在选项 1 中,不一定要保持行的顺序。

    【讨论】:

    • 使用简单 Excel 公式或值映射器的公式步骤。我猜 Value Mapper 步骤会更适合添加。
    • 我倾向于不使用公式步骤,但你是对的,它也是一个选项。值映射器无法工作,因为他不一定知道输入值。
    【解决方案2】:

    **答案不再适用于新的问题详细信息**

    如果您要更新数据库表,到目前为止,最好和最有效的解决方案是在单个 SQL 语句中完成。

    在 Pentaho 作业中,添加一个 SQL 步骤(在脚本下)。

    在该步骤中输入 SQL 命令。它将类似于:

    UPDATE MyTable
    SET comment = 
        CASE 
            WHEN quantity > 0 THEN 'available'
            WHEN quantity < 0 THEN 'warning'
            ELSE 'to order'
        END
    // next line optional, use it if you only need to update some of the records.
    WHERE (insert conditions here if you need any)
    

    作为补充说明,让两列始终保持同步并不理想,但需要依赖外部作业才能使它们保持同步。有一些技术,如数据库触发器或在检索 select 语句中的行时计算 case/when,从而消除了字段不同步的可能性。

    【讨论】:

    • 嗨,感谢您的回复 :) 实际上我在帖子中添加了一些细节。
    • 我确实按照你说的尝试过,但是需要更长的时间,我在“表格输入”步骤之后添加了这一步(我在帖子中新解释了我所做的其他步骤)
    • @ayay 对于您添加的新详细信息,此答案无效。由于您只提到“我有一张桌子”,我假设您正在尝试丰富/更新该一张桌子。当数据来自不同的来源时,一定要在流中添加 cmets 字段并将它们包含在表输出中。
    • 对不起,我一点都不清楚。哪个步骤可用于添加 cmets 字段?我已经有公式步骤,我在数量字段上进行计算。不要以为我可以在同一步骤做某事
    • @ayay nsousa 的回答列出了不错的选择,但如果您更熟悉类似 Excel 的公式,则可以添加第二个公式步骤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多