StarRocks LEAST 函数完全指南:语法、类型比较规则与源码级实现解析

发布时间:2026/9/20 1:21:08
StarRocks LEAST 函数完全指南:语法、类型比较规则与源码级实现解析 StarRocks LEAST 函数完全指南语法、类型比较规则与源码级实现解析【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocksLEAST 是 StarRocks 中用于从一至多个参数列表中返回最小值的标量函数常用于数据清洗、边界值裁剪与多列/多字段最小值计算等场景。本文以官方函数参考文档 least.md 为主体结合前端函数注册与类型推导、优化器统计信息估算等源码实现完整讲解语法、支持的数据类型、混合类型比较规则、完整示例并给出可直接运行的实际使用建议。函数概述LEAST(expr1, ...)返回一个或多个参数中的最小值。它是GREATEST函数的对偶操作后者返回最大值两者的比较规则完全一致因此理解LEAST的比较语义就等于同时掌握了GREATEST。在 StarRocks 源码中least与greatest被一同注册为内置函数名见 FunctionSet.javapublic static final String GREATEST greatest; public static final String LEAST least;在前端 SQL 分析器阶段两者会被归入同一组做类型推导与检查例如 DecimalV3FunctionAnalyzer.java 中对LEAST、GREATEST、NULLIF等函数进行 Decimal 类型相关的参数一致性校验优化器的统计信息估算环节也会对GREATEST/LEAST调用进行表达式统计计算见 ExpressionStatisticCalculator.java说明该函数参与查询计划的代价估算与优化。语法LEAST(expr1,...);参数个数一个或多个...表示可变参数至少传入一个表达式否则无法调用。参数与支持的数据类型参数expr1支持以下数据类型与GREATEST完全一致类别支持类型整数SMALLINT、TINYINT、INT、BIGINT、LARGEINT浮点FLOAT、DOUBLE十进制DECIMALV2、DECIMAL32、DECIMAL64、DECIMAL128时间DATETIME字符串VARCHAR返回值类型一般情况下返回值与输入参数的数据类型保持一致。当输入中包含DOUBLE、DECIMAL或FLOAT等类型时所有参数会被统一提升为相应类型后再比较返回值也相应提升详见下文比较规则。比较规则LEAST的比较规则与GREATEST相同归纳如下NULL 传播只要任一输入参数为 NULL则返回 NULL。类型提升只要至少有一个参数为DOUBLE类型所有参数都按DOUBLE比较DECIMAL与FLOAT类型同理。这意味着不同数值精度的参数会先统一到同一类型再比较大小。数字与字符串混用若字符串可以被转换为数字则所有参数按数字比较若字符串无法被转换为数字则所有参数按字符串比较。纯字符串比较若参数都是字符/字符串则按字母顺序比较逐字符比较其字典序。示例以下示例均来自官方文档可在 StarRocks 的 mysql 客户端中直接执行验证。示例 1单个输入返回其本身select least(3); ---------- | least(3) | ---------- | 3 | ---------- 1 row in set (0.00 sec)示例 2多个数值返回最小值select least(3,4,5,5,6); ---------------------- | least(3, 4, 5, 5, 6) | ---------------------- | 3 | ---------------------- 1 row in set (0.01 sec)示例 3包含 DOUBLE 类型参数按 DOUBLE 比较并返回 DOUBLEselect least(4,4.5,5.5); -------------------- | least(4, 4.5, 5.5) | -------------------- | 4.0 | --------------------注意结果返回4.0而非4验证了“含 DOUBLE 参数时整体按 DOUBLE 比较与返回”的规则。示例 4数字与可转数字字符串混用按数字比较select least(7,5); --------------- | least(7, 5) | --------------- | 5 | --------------- 1 row in set (0.01 sec)字符串5可转换为数字 5因此参数按数字比较返回5。示例 5数字与不可转数字字符串混用按字符串比较select least(1,at); ---------------- | least(1, at) | ---------------- | 1 | ----------------字符串at无法转换为数字此时参数按字符串比较1小于at按字典序故返回1。示例 6纯字符参数按字母顺序比较mysql select least(A,B,Z); ---------------------- | least(A, B, Z) | ---------------------- | A | ---------------------- 1 row in set (0.00 sec)字母A字典序最小返回A。与 GREATEST 的对照LEAST与GREATEST共享相同的参数类型、比较规则与实现路径仅方向相反。下表给出对照场景LEASTGREATEST(3,4,5,5,6)36(4,4.5,5.5)4.05.5(7,5)57(1,at)1at(A,B,Z)AZGREATEST的完整文档见 greatest.md。实战使用建议多列最小值计算可用LEAST取代嵌套IF/CASE WHEN判断例如求三列数值中的最小值SELECT LEAST(c1, c2, c3) FROM t;。边界值裁剪常用于将取值限制在上限之内如LEAST(score, 100)表示分数最高不超过 100。与 NULL 处理的配合由于任一参数为 NULL 时结果即为 NULL对可能含 NULL 的列需要先用IFNULL/COALESCE处理或结合NULLIF使用。前端分析器将LEAST与NULLIF等函数归入同一类型检查组见 DecimalV3FunctionAnalyzer.java表明这类组合用法是官方支持的分析路径。类型一致性混用INT与DOUBLE时会自动提升为DOUBLE返回值可能出现小数位如4.0在对接报表展示或类型敏感的写入场景时需注意。字符串与数字混用时明确意图若希望按数字比较请确保字符串可被解析为数字否则将退化为字符串字典序比较语义可能不符合预期。关键词LEAST, least, 最小值, 数学函数【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考