【问题标题】:Case when to transform string to int if is is not already an int如果 is 还不是 int,则将字符串转换为 int 的情况
【发布时间】:2019-01-17 20:49:32
【问题描述】:

所以,我有一个问题,我有一个通过宏变量非常灵活的 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” 或参数类型。

你知道我可以如何防止这个错误吗?当第一个案例已经成立时,为什么还要看另一个案例?

【问题讨论】:

    标签: sql teradata case-when


    【解决方案1】:

    这是一个解析时间错误,试图将 To_Number 应用于数值。我认为如果没有动态 SQL,您将无法为所欲为。

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

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

    当然,对于较大的表来说效率不是很高。

    【讨论】:

    • 是的,那行得通,当我基于 SAS 宏动态生成 sql 时,它的性能会更好吗?所以SAS宏先检查值的类型,然后生成sql代码?
    • 我只是想更新一下,当你使用SAS的时候你可以使用这个解决方案来动态编程 --> stackoverflow.com/questions/4496159/… 来获取列的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2011-11-28
    • 1970-01-01
    • 2011-10-02
    相关资源
    最近更新 更多