0

我正在为主数据构建一个暂存层,并有以下情况和当前解决方案。我的交易数据只有主数据 ID 或“代码”,没有文字描述。大多数我所有的文本描述都在一个通用表中提供,其中包含所有可能的“代码”及其后续文本值。在将此数据移动到暂存层时,我需要根据原始字段长度将 VARCHAR(60) 中的代码修剪为实际字段长度。

简而言之,主数据代码从正确投射到此着陆环境的源环境和填充它们的 VARCHAR(60) 中移动。当我进入 Staging 时,我需要根据字段长度进行修剪。

我正在使用以下 SQL,但已将其包装在 CASE 逻辑中以管理我将看到的不同可能的字段长度。因此,我必须为我处理的每个不同的 MD 代码重现这一点逻辑。我正在寻找一种方法来调整它,以便它在一个逻辑中处理所有字段长度。

SELECT ATTR_NM
    , CASE 
        WHEN ATTR_NM = 'DOC_TYP'
            THEN(
                CASE WHEN CHARACTER_LENGTH (TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD)) > 1
                    THEN SUBSTRING( tx.MSTR_DATA_ATTR_CD FROM CHARACTER_LENGTH(TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD))-1)
                    ELSE tx.MSTR_DATA_ATTR_CD
                END
                )
    WHEN SAP_ATTR_NM = 'ACCT_GRP'
        THEN(
            CASE WHEN CHARACTER_LENGTH (TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD)) > 4
                THEN SUBSTRING( tx.MSTR_DATA_ATTR_CD FROM CHARACTER_LENGTH(TRIM(BOTH FROM tx.MSTR_DATA_ATTR_CD))-2)
                ELSE tx.MSTR_DATA_ATTR_CD
            END
            )
        END AS MSTR_DATA_ATTR_CD
    , LANG_ISO_CD AS LANG_ISO_CODE
    , tx.LANG AS LANG
    , tx.END_DT AS END_DT
    , tx.FRM_DT AS FRM_DT
FROM MASTER_DATA_DESC_BASE_VOL tx;

我不能只修剪前导 0,因为我可以有一个带有前导 0 的代码。我需要知道字段长度,然后通过 Trim 函数调用应用该数值。或者有人有更好的方法。我是一名长期的程序员顾问,但对 Teradata 有点陌生。

此外,这是有效的,目前可以处理 20 多种不同的情况,并且运行效率很高。我只知道有更好的方法来做我需要的事情,而且我还必须继续添加越来越多的案例。

4

0 回答 0