【发布时间】: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