LPAD 左侧补齐
LPAD(str, len, pad) 在左侧用 pad 补齐到 len 个字符,str 比 len 长时截断。七个引擎都同名可用,差异在边界情况:填充串为空时 Hive 返回 NULL、Doris 返回空字符串;StarRocks、Spark 和 Hologres 可以省略 pad,默认补空格。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | LPAD(str1, length, str2) | length 小于 str1 长度时从左截取 length 位;length 为 0 时返回空串;任一参数为 NULL 时返回 NULL。 | 官方文档 |
| Hologres | 支持 | LPAD(str, length[, fill]) | str 已超过 length 时从右侧截断,只保留前 length 个字符。不指定 fill 时补空格。 | 官方文档 |
| StarRocks | 支持 | lpad(str, len[, pad]) | len 按字符计算。str 比 len 长时截断;不传 pad 时补空格。 | 官方文档 |
| Doris | 支持 | LPAD(str, len, pad) | 按字符长度计算。len 小于原长度时只保留前 len 个字符;pad 为空串且需要补齐时返回空字符串;len 为负数时返回 NULL。 | 官方文档已实测 4.1.5 |
| Hive | 支持 | lpad(string str, int len, string pad) | str 比 len 长时截断为 len 个字符。pad 为空串时返回 NULL。 | 官方文档已实测 4.2.1 |
| Spark SQL | 支持 | lpad(str, len[, pad]) | Spark 1.5.0 起提供。str 比 len 长时截断;不传 pad 时字符串补空格。 | 官方文档 |
| Flink SQL | 支持 | LPAD(string1, integer, string2) | string1 比 integer 长时截断为 integer 个字符。 | 官方文档已实测 2.3.0 |
迁移注意事项
- pad 为空串时结果不同:Hive 返回 NULL,Doris 返回空字符串,其他引擎文档没有说明。补齐用的字符来自字段时要先排除空值。
- LPAD 会截断超长的字符串,而不是原样返回。用 LPAD(id, 8, '0') 补零时,超过 8 位的编号会被截成前 8 位,导致数据错误。
- StarRocks、Spark 和 Hologres 可以省略 pad,默认补空格;MaxCompute、Doris、Hive 和 Flink 必须写第三个参数。
示例
把编号补齐为 6 位
SELECT LPAD(CAST(id AS STRING), 6, '0') FROM items;SELECT LPAD(CAST(id AS TEXT), 6, '0') FROM items;SELECT lpad(CAST(id AS VARCHAR), 6, '0') FROM items;SELECT LPAD(CAST(id AS VARCHAR), 6, '0') FROM items;SELECT lpad(CAST(id AS STRING), 6, '0') FROM items;SELECT lpad(CAST(id AS STRING), 6, '0') FROM items;SELECT LPAD(CAST(id AS STRING), 6, '0') FROM items;