【问题标题】:zero padding in teradata sqlteradata sql中的零填充
【发布时间】:2014-07-01 21:10:42
【问题描述】:

A表
id varchar(30)

我正在尝试重新创建一个逻辑,我必须使用 9 位 ID,而不管 Id 字段的值的实际长度如何。
因此,例如,如果 Id 的长度为 6,我需要用 3 个前导零填充。实际长度可以是 1 到 9 之间的任何值。

任何想法如何在 Teradata SQL 中实现这一点?

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

    如果实际长度为 1 到 9 个字符,为什么将列定义为 VarCar(30)?

    如果是数字列就很简单了:

    CAST(CAST(numeric_col AS FORMAT '9(9)') AS CHAR(9))
    

    对于字符串,没有这样的 FORMAT,但根据您的版本,您可能有一个 LPAD 函数:

    LPAD(string_col, 9, '0')
    

    否则是:

    SUBSTRING('000000000' FROM CHAR_LENGTH(string_col)+1) || string_col,
    

    如果有超过九个字符,所有之前的计算都会返回它们。

    如果您想截断(或使用 CHAR 而不是 VARCHAR 结果),您必须添加最终的 CAST AS CHAR(9)

    最后,如果有前导或尾随空格,您可能需要使用TRIM(string_col)

    【讨论】:

    • SUBSTRING('000000000' FROM CHAR_LENGTH(string_col)+1) || string_col 为我工作。谢谢!
    • @dnoeth:你能解释一下AS FORMAT '9(9)'的语法吗?
    • @Jubbles:这是 Cobol 风格的,9 表示包含前导零,(9) 重复前一个格式字符 9 次,所以它与 999999999 相同。见info.teradata.com/htmlpubs/DB_TTU_14_00/index.html#page/…
    • @dnoeth 第一行是如何工作的。如果 numeric_col 只有 3 位,它将用前导零填充其余 6 位?
    • @Vinod ,是的,它在将数值转换为字符串时应用了格式规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多