所以,我有一个问题,我有一个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”以无效数字调用 或参数类型。
您知道如何防止此错误吗?当第一个已经为真时,为什么还要看另一种情况呢?
答案 0 :(得分:0)
这是解析时间错误,试图将To_Number应用于数字值。我认为如果没有Dynamic SQL,您将无法做您想做的事。
但这会通过将数字值首先强制转换为字符串来返回类似的结果:
Coalesce(Cast(To_Number(Trim(data.&columnSId.)) AS INT), 0)
当然,对于较大的表,这不是很有效。