如何在AWS Step Functions中比较字符串类型的数值?
如何在AWS Step Functions中无需Lambda实现字符串数值的数值比较?
问题场景
我需要比较两个字符串类型的数值(来自Lambda输出到Step Functions的结果),希望以数值方式判断是否大于等于,从而决定后续流程,但当前比较总是进入错误分支。尝试过States.FormatNumber和States.StringToJson都没用,想知道有没有不用Lambda的实现方法。
失败示例1:直接使用数值比较规则
输入:
{ "v2_table": { "count": "2" }, "original_table": { "count": "2" } }
对应的Step Functions定义:
{ "StartAt": "CompareCounts", "States": { "CompareCounts": { "Type": "Choice", "Choices": [ { "Variable": "$.v2_table.count", "NumericGreaterThanEqualsPath": "$.original_table.count", "Next": "CountsMatch" } ], "Default": "CountsDoNotMatch" }, "CountsMatch": { "Type": "Pass", "End": true }, "CountsDoNotMatch": { "Type": "Pass", "End": true } } }
执行结果:错误进入CountsDoNotMatch分支。
失败示例2:使用字符串比较规则
Step Functions定义:
{ "StartAt": "CompareNumberAsString", "States": { "CompareNumberAsString": { "Type": "Choice", "Choices": [ { "Variable": "$.argument_one", "StringGreaterThanEqualsPath": "$.argument_two", "Next": "ArgumentOneGreaterThanEquals" } ], "Default": "ArgumentTwoGreaterThan" }, "ArgumentOneGreaterThanEquals": { "Type": "Pass", "End": true }, "ArgumentTwoGreaterThan": { "Type": "Pass", "End": true } } }
输入:
{ "argument_one": "11", "argument_two": "100" }
执行结果:同样错误(按字符串字典序比较时,"11"会被判定为大于"100",不符合数值比较逻辑)。
注意:如果把参数改成数值类型,用
NumericGreaterThanEqualsPath可以正常工作,但我的场景只能用字符串类型数值。
解决方案:使用States.StringToNumber转换类型后再比较
Step Functions内置的States.StringToNumber函数可以直接将字符串格式的数值转换为数值类型,无需依赖Lambda。具体实现步骤如下:
- 新增Pass状态转换字符串为数值:在Choice比较之前,添加一个Pass状态,将两个字符串数值字段转换为数值类型,存入新的路径中。
- 在Choice状态中使用转换后的数值进行比较:使用转换后的数值字段执行
NumericGreaterThanEqualsPath比较。
完整Step Functions定义示例
{ "StartAt": "ConvertStringToNumbers", "States": { "ConvertStringToNumbers": { "Type": "Pass", "Parameters": { "v2_count.$": "States.StringToNumber($.v2_table.count)", "original_count.$": "States.StringToNumber($.original_table.count)" }, "Next": "CompareCounts" }, "CompareCounts": { "Type": "Choice", "Choices": [ { "Variable": "$.v2_count", "NumericGreaterThanEqualsPath": "$.original_count", "Next": "CountsMatch" } ], "Default": "CountsDoNotMatch" }, "CountsMatch": { "Type": "Pass", "End": true }, "CountsDoNotMatch": { "Type": "Pass", "End": true } } }
为什么之前的方法无效?
NumericGreaterThanEqualsPath仅支持数值类型数据,直接传入字符串会导致比较逻辑失效,Step Functions不会自动转换类型。StringGreaterThanEqualsPath按字符串字典序比较,而非数值大小,比如"11"和"100"比较时,字典序中"11"会被判定为更大,不符合数值比较预期。States.FormatNumber用于将数值格式化为字符串,而非反向转换;States.StringToJson仅能解析完整JSON格式的字符串,无法直接转换单个字符串数值。
内容的提问来源于stack exchange,提问作者krishna Prasad
相关产品推荐
相关产品推荐

