0

我正在尝试将 Oracle 中的数字列转换为用前导零填充的字符串。我遇到的问题是我可以很好地转换为 Unicode 值,但是当我这样做时我必须指定长度。总长度将是 9 和零。如果数字只有 7 位或 8 位,我必须添加零。

问题是:当我在派生列块中将数字转换为 WSTR 时,我必须指定长度。如果我将长度指定为 9,我的填充零代码将不起作用。我假设是因为它认为它已经有 9 个字符长。我在表达式中添加了对 TRIM 的调用,希望它将值缩短为 7 或 8,然后填充零,但这不起作用。

有什么建议么?

编辑:这是我现在正在处理的表达式:

ISNULL([CERT_NUM]) ? "" :  REPLICATE( "0", 9 - LEN((DT_WSTR, 9)[CERT_NUM] )) + (DT_WSTR, 9)[CERT_NUM]

来自以下答案的解决方案:

ISNULL(CERT_NUM) ? "" : RIGHT(REPLICATE("0",9) + (DT_WSTR,9)(DT_I4)CERT_NUM,9)

我将数字列转换为 int 以删除小数,转换为长度为 9 的字符串,连接 9 个零并取正确的 9 个字符。

4

1 回答 1

1

我对左填充内容的方法是将它们放在一起,然后抓取正确的 N 位

RIGHT((REPLICATE("0",9) + (DT_WSTR,9)[SourceColumn]), 9)

我构建了一个全零字符串,将其与我的 SourceColumn 连接,然后丢弃除最后 9 个字符之外的所有字符。与您的代码类似,但更简单,因为我不在乎原始长度是多少。

我可以看到的另一件事是您可以处理可为空的列,并且您已经确定您将使用三元运算符来处理它。

(IsNull([SourceColumn])) ? 
    "" 
    : RIGHT((REPLICATE("0",9) + (DT_WSTR,9)[SourceColumn]), 9)

另一件需要简单注意的事情是,有时您需要向整个表达式添加另一个显式转换。关于三元运算符的某些事情只会让更改数据类型感到困惑

(DT_WSTR, 9)((IsNull([SourceColumn])) ? 
    "" 
    : RIGHT((REPLICATE("0",9) + (DT_WSTR,9)[SourceColumn]), 9))

我无法解决您问题的原因。

无论源列的总位数如何,您都需要强制转换为最大长度。

于 2013-09-30T18:46:28.317 回答