【问题标题】:How do you check if a field contains all numeric values using Teradata SQL?如何使用 Teradata SQL 检查字段是否包含所有数值?
【发布时间】:2017-03-01 06:30:12
【问题描述】:

我正在使用 Teradata SQL 从 T-SQL 中寻找类似于 ISNUMERIC() 的函数。如果字符类型字段中包含的数据都是数字,我想要一个简单的方法来返回布尔值(或数字 1/0)。

例如:

我的专栏有以下记录:'001''ABC'

我希望查询返回:1(或 True)0(或 False)

有没有TD原生支持的类似ISNUMERIC()的方法?我找到了一些可以使用的正则表达式选项,但想看看在走这条路之前是否有更简单的方法。如果不存在这样的方法,我愿意接受有关完成此操作的建议。

【问题讨论】:

    标签: teradata


    【解决方案1】:

    TD15.10 支持TRYCAST('ABC' AS INT),它在转换失败时返回 NULL。

    TO_NUMBER('ABC') 也会为错误数据返回 NULL。

    '' 或 '.' 之类的字符串有一些区别:TRYCAST('' AS INT) 返回 0TO_NUMBER('') 返回 NULL

    对于像-/: 这样的分隔符也是如此,它们被trycast 忽略但未被to_number 忽略:TryCast('05-075' AS INT) 返回5075TO_NUMBER 返回NULL

    您可以基于此编写 CASE 并将其放入 SQL UDF 中。

    【讨论】:

    • 这应该可以完美运行 - 谢谢!我是 TD 的新手,不确定我们使用的是什么版本。我不认为 trycast 是一种选择,但我们确实有 to_number。我将把它包装在一个 fn 中。
    • @Sevyns: select * from dbc.dbcinfoV; 显示实际版本。
    【解决方案2】:

    这并不总是有效。请查看以下示例:

    SEL TryCast('12-31-2018' AS INT) -- Result: 12312018
    SEL TryCast('05-075' AS INT) -- Result: 5075
    SEL TryCast('075+' AS INT) -- Result: 75
    SEL TryCast('/099' AS INT) -- Result: 99
    SEL TryCast('55/55' AS INT) -- Result: 5555
    

    推荐:

    REGEXP_SIMILAR(TRIM(Value), '^[0-9]{14}$') = 1
    

    【讨论】:

    • 是的,trycast 在 Teradata 中使用与 CAST 相同的规则(忽略 FORMAT 中的分隔符),所以最好使用 to_number
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多