如何使用CAST

时间:2016-01-13 21:02:58

标签: teradata

我们说我需要CAST(birth_date AS DATE FORMAT 'MM/DD/YYYY')

如果birth_date字段包含空值或无效字符,则会抛出且不可翻译的字符错误

当然我可以使用regexotranslate,但所有这些都会使sql

过于复杂化

有没有办法可以抑制所有这些错误? CAST如果可以,否则将其设为null

2 个答案:

答案 0 :(得分:2)

检查数据是否适合您希望存储的数据类型的负担必须驻留在某处。您可以使用CASE {regular expression matching} THEN CAST() ELSE NULL END这可能是解决SQL中数据质量验证的最简洁方法。

否则,预处理数据文件以使用可在SQL中替换为NULL的令牌替换错误数据。您可以考虑在PowerShell,UNIX shell脚本或第三方工具(例如地址清理/格式化等)中执行此操作。

答案 1 :(得分:2)

由于没有内置的方式来说CAST(<field> as <datatype) IGNORING ERRORS AS <alias>,您可以使用TPT脚本。

在TPT APPLY中,您可以将INSERT语句路由错误分配到两个不同的错误表中。

以下内容可以让您接近。这是您在加载脏日期表后将其运行到干净的日期表中的情况。

DEFINE JOB DATA_insert_Example
(
        DEFINE OPERATOR data_insert_Example
        TYPE UPDATE
        SCHEMA *
        ATTRIBUTES
        (
               VARCHAR UserName,
               VARCHAR UserPassword,
               VARCHAR LogTable,
               VARCHAR TargetTable,
               INTEGER BufferSize,
               INTEGER ErrorLimit = 5,
               INTEGER MaxSessions = 4,
               INTEGER MinSessions = 1,
               INTEGER TenacityHours,
               INTEGER TenacitySleep,
               VARCHAR AccountID,
               VARCHAR AmpCheck,
               VARCHAR DeleteTask,
               VARCHAR ErrorTable1 = '<yourdatabase>.<yourcleantable>'||'_ET',
               VARCHAR ErrorTable2 = '<yourdatabase>.<yourcleantable>'||'_UV',
               VARCHAR NotifyExit,
               VARCHAR NotifyExitIsDLL,
               VARCHAR NotifyLevel,
               VARCHAR NotifyMethod,
               VARCHAR NotifyString,
               VARCHAR PauseAcq,
               VARCHAR PrivateLogName,
               VARCHAR TdpId,
               VARCHAR TraceLevel,
               VARCHAR WorkingDatabase = <yourdatabase>,
               VARCHAR WorkTable = '<yourdatabase>.<yourcleantable>'||'_Work'
        );

        DEFINE SCHEMA data_insert_schema
        (
                field1 VARCHAR(20),
                field2 VARCHAR(20),
                field3 VARCHAR(20),
                field4 VARCHAR(20)
        );

        DEFINE OPERATOR data_insert_export
        TYPE EXPORT
        SCHEMA W_0_s_DATA_esuh
        ATTRIBUTES
        (
                VARCHAR UserName,
                VARCHAR UserPassword,


  STEP UPS
    (
        APPLY
        (
            'INSERT INTO <yourdatabase>.<yourcleantable> 
                field1,
                field2,
                field3,
                field4
             VALUES (
                :field1,
                :field2,
                :field3,
                :field4,
              )';

        )   


        TO OPERATOR
        (
                data_insert_Example[1]

                ATTRIBUTES
                (
                        UserName = <yourusername>,
                        UserPassword = <yourpass>,
                        LogTable = <yourdatabase>.<yourcleantable> ||'_LOG',
                        TargetTable = <yourdatabase>.<yourcleantable> ,
                        TdpId = <yourserverip/address>
                )
        )
        SELECT * FROM OPERATOR
        (
                data_insert_export[1]

            ATTRIBUTES
            (
                    UserName = <yourusername>,
                    UserPassword = <yourpassword>,
                    SelectStmt = 'SELECT field1,field2,field3,field4 FROM <yourdatabase>.<yourtable> ;',
                    TdpId = '<yourserverip/address>'
            )
        );       
    );
)

但显然,这比简单的REGEX更难以解决。当您第一次开始使用RegEx时,RegEx感觉压倒一切,但我认为在尝试将它们转换为正确的数据类型之前检查存储为字符串文字的日期是一个完全合理的用例。

总的来说,听起来你有数据垃圾,所以我完全感到沮丧。不幸的是,对于垃圾数据,没有灵丹妙药。你需要在垃圾和清洁输出之间有一些像样的ETL。