【问题标题】:Teradata - Adding preceding zero and casting as varchar(50)Teradata - 添加前面的零并转换为 varchar(50)
【发布时间】:2018-06-05 01:36:09
【问题描述】:

我有以下疑问:

SELECT
  s.cola, s.colb, t.colc, t.cold, u.cole, u.colf, u.colg, u.colh, u.coli, u.colj, u.colk, u.coll 
FROM table1 s
INNER JOIN table2 t
  ON s.colb = t.colc
INNER JOIN table3 u
  ON u.colm = CAST(t.cold AS varchar(50))
WHERE cast(s.cola as date) between date '2017-11-06' and date '2017-11-10'
ORDER BY 3

这里,在最后一个连接条件中,u.colm 的类型为 varchar(50)t.cold 的类型为 decimal(10, 0)。我不能将u.colm 转换为decimal(10, 0),因为该列中的一些过时值并不是纯粹的数字。现在,如果我如上所示运行查询,它将返回一个空白表,因为u.colm 中的常见值有一个前置/前导零,而t.cold 没有那个零。我尝试了以下方法:

1) on u.colm = '0' + cast(t.cold as varchar(50))

这给出了错误: [Teradata Database] [2620] The format or data contains a bad character.

2) on u.colm = right('0000000000' + cast(t.cold as varchar(50)), 50)

这给出了错误: [Teradata Database] [9881] Function 'TD_RIGHT' called with an invalid number or type of parameters

link1 中的问题、答案和 cmets 将提供更多上下文。我对 Teradata 很陌生,对如何解决这个问题没有太多想法。请帮忙。

【问题讨论】:

  • 为什么不使用我提出的方法在join之前删除坏数据呢? WHERE u.colm > '' AND TO_NUMBER(u.colm) IS NULL。前导零的数量是否一致?你能展示一些现有的数据吗?
  • u.colm 来自的表具有属于三个类别的数字。应该与t.cold 匹配的类别前面有零,并且在所有情况下都是10 位数字。 t.cold 值都是 9 位数字,因为它们前面没有零。
  • 我正在尝试合并您的where 子句。之后我会更新。谢谢。
  • @dnoeth :看起来添加你的where 子句解决了这个问题。您能否将其发布为答案,以便我接受?谢谢。
  • 这与我在您之前的问题上发布的位置相同 :-)

标签: sql inner-join teradata on-clause


【解决方案1】:

I believe Teradata supports the LPAD() function,所以你可以使用:

u.colm = lpad(t.cold, 10, '0')

【讨论】:

  • 上面写着:[Teradata Database] [9881] Function 'LPAD' called with an invalid number or type of parameters
猜你喜欢
  • 2014-12-31
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2021-09-15
  • 2010-10-15
  • 2015-06-27
  • 2014-08-01
相关资源
最近更新 更多