如果尚未将字符串转换为int的情况

时间:2018-08-10 09:19:02

标签: sql teradata case-when

所以,我有一个问题,我有一个Teradata SQL代码,该代码通过宏变量非常灵活,因此INPUT可以是不同类型的表。在那些
表中有信息s_id,但是有时s_id是字符串,有时是int。因此,我想将字符串转换为int,如果已经是int,则应该只复制值。

SELECT DISTINCT &i as F_ID,    
/*In different Tables the Sid can appear as an string or integer. This CASE WHEN transforms a string into a Integer in case of a not numeric ID*/
CASE WHEN TYPE(data.&columnSId.) not like '%CHAR%' and to_number(data.&columnSId.) is NULL
THEN data.&columnSId. 
WHEN TYPE(data.&columnSId.) like '%CHAR%'                       
THEN CAST(to_number(data.&columnSId.) as FLOAT) 
ELSE 0 
END as s_id,
FROM database.table

无论如何,如果s_id已经是一个int,它仍然尝试使用函数to_number,该函数将失败并以该错误结尾:

  

Teradata执行:函数“ to_number”以无效数字调用   或参数类型。

您知道如何防止此错误吗?当第一个已经为真时,为什么还要看另一种情况呢?

1 个答案:

答案 0 :(得分:0)

这是解析时间错误,试图将To_Number应用于数字值。我认为如果没有Dynamic SQL,您将无法做您想做的事。

但这会通过将数字值首先强制转换为字符串来返回类似的结果:

Coalesce(Cast(To_Number(Trim(data.&columnSId.)) AS INT), 0)

当然,对于较大的表,这不是很有效。