Teradata - 将 Varchar 与十进制进行比较

skr*_*obo 1 sql inner-join teradata

我对一般来说都很Teradata陌生SQL。我需要通过组合三个表中的数据来创建一个表。我能够成功地加入其中的两个。我无法正确编写第三个表的连接条件。这是代码:

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 t.cold = cast(u.colm as decimal)
order by 3
where substr(cast(s.cola as varchar(10)),6,2) = 11 and substr(cast(s.cola as varchar(10)),1,4) = 2017 and substr(cast(s.cola as varchar(10)),9,2) between 06 and 10
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

[Teradata Database] [2620] The format or data contains a bad character.

我认为问题出在这一行:on t.cold = cast(u.colm as decimal)。的u.colm类型为VARCHAR(50),而t.cold的类型为DECIMAL(10, 0)。我相信我已经正确地投射了它。请帮忙。提前致谢。

dno*_*eth 5

里面有一些坏数据u.colm

根据您的 Teradata 版本,您可以使用以下命令进行检查

WHERE u.colm > '' AND TRYCAST(u.colm as decimal(10,0)) ISNULL
Run Code Online (Sandbox Code Playgroud)

或者

WHERE u.colm > '' AND TO_NUMBER(u.colm) IS NULL
Run Code Online (Sandbox Code Playgroud)

您还可以在连接条件中使用它们,例如

on t.cold = trycast(u.colm as decimal(10,0))
Run Code Online (Sandbox Code Playgroud)

不要忘记添加小数精度,因为它默认为(5,0).

你的 WHERE_condition 很奇怪,它的数据类型是什么s.cola?似乎它是一个带有日期的字符串yyyy-mm-dd。尝试

WHERE trycast(s.cola as date) between date '2017-11-06' and date '2017-11-10' 
Run Code Online (Sandbox Code Playgroud)

最后ORDER BY应该放在 后面WHERE