基于多条件拼接两列的Jolt Spec实现问题求助
Jolt多条件拼接A/B列生成C列解决方案
需求场景
- A="M-L"、B="S-L" → C="M-L,S-L"
- A为空、B="S-L" → C="S-L"
- A="M-L"、B为空 → C="M-L"
- A、B均为空 → C=""
解决方案1:简洁链式处理Spec
这种方式通过字符串替换一步覆盖所有场景,避免复杂的条件分支:
[ { "operation": "modify-overwrite-beta", "spec": { "C": [ "${A},${B}", "=replaceAll(@, '^,|,$', '')", "=default('', '')" ] } } ]
逻辑说明
- 先拼接A和B,得到包含冗余逗号的临时结果(比如
,S-L、M-L,、,) - 用正则替换去掉开头或结尾的逗号,自动处理单字段非空的场景
- 最后确保当A、B都为空时,C保持空字符串
解决方案2:显式条件分支Spec
如果需要更清晰的条件判断逻辑,可按优先级顺序定义分支(优先级从高到低,避免分支覆盖):
[ { "operation": "shift", "spec": { "@": "&", // 场景1:A、B均非空 "A": { "*": { "@2,B": { "*": { "#${A},${B}": "C" } } } }, // 场景2:A空、B非空 "B": { "*": { "@2,A": { "": { "#${B}": "C" } } } }, // 场景3:B空、A非空 "A": { "*": { "@2,B": { "": { "#${A}": "C" } } } }, // 场景4:A、B均为空 "A": { "": { "@2,B": { "": { "#": "C" } } } } } } ]
逻辑说明
按场景优先级依次匹配:先处理A、B都有值的情况,再处理单一字段非空的情况,最后处理都为空的场景。之前else分支不生效,大概率是条件顺序错误或层级定义不当,导致高优先级分支覆盖了低优先级分支。
内容的提问来源于stack exchange,提问作者Mahesh Manchineni
相关产品推荐
相关产品推荐

