You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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。具体实现步骤如下:

  1. 新增Pass状态转换字符串为数值:在Choice比较之前,添加一个Pass状态,将两个字符串数值字段转换为数值类型,存入新的路径中。
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 18:08:45