【问题标题】:Netezza Formatting FunctionsNetezza 格式化函数
【发布时间】:2016-04-07 07:53:14
【问题描述】:

我导入了一组较大的数据,有时采用奇数格式(例如 12,345.01- 和 1,945.001-),我正在尝试“修复”它。

数据导入为VARCHAR(20)

我的解决方案:

to_number(BadNumCol, 'S999G999G999D999')

input: 10426.95 ;261.000 ;33.93-

outputs:42695.00 ;261.000 ; 3.93

the output is NUMERIC(12,3)

desired output: 10426.95 ; 261.000 ; -33.93

这里发生了什么?我在无知中错过/不理解什么?

而且,我该如何修复这大约 4 亿个数据元素?

【问题讨论】:

  • “解决方案”部分中示例输入数据的格式与问题第一行中示例输入数据的格式不同。一个有组分隔符,一个没有。你能澄清一下吗?

标签: sql format number-formatting type-conversion netezza


【解决方案1】:

我在这里看到了两个问题。

对于来自数据“解决方案”部分的示例输入数据,没有任何示例输入数据具有组分隔符,因此您在 TO_NUMBER 函数中指定的组分隔符不匹配。

此外,当您的数据有一个尾随减号时,您正在指定一个锚定到字符串开头的符号字符。

我可以从您的示例输入数据中推断出最合适的转换格式字符串是:'999999999D999MI'

select * from num_test;
 BADNUMCOL
-----------
 261.000
 10426.95
 33.93-
(3 rows)

select to_number(BadNumCol,'999999999D999MI')::NUMERIC(12,3) GoodNumCol from num_test;
 GOODNUMCOL
------------
  10426.950
    -33.930
    261.000
(3 rows)

【讨论】:

  • 太好了,谢谢。我知道这很简单。 MI 更像是一个指针,告诉当前模式在哪里可以找到减号(如果需要)?
  • 我可能把我对上面评论的编辑搞砸了。我现在知道了。格式化更多地是一种沟通如何解释输入的方式,而不是解释如何格式化输出。现在文档更有意义。谢谢你..
  • 你是对的。 MI 令牌告诉它末尾可能有一个减号。从技术上讲,我们可以将 S 放在末尾,这可能会使它更灵活,但我默认使用 MI,因为我从未在字符串末尾看到加号。
  • 如果这对您有用,请不要忘记将问题标记为已回答。欢迎来到 SO
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
  • 2018-08-31
相关资源
最近更新 更多