2

我正在使用 Teradata 处理一些描述性数据,这些数据需要根据数据元素的类型和属性值从通用 varchar(60) 转换为不同的字段长度。因此,我需要采用 Varchar(60) 中的任何内容,并根据字段“ABCD”对字段“XYZ”进行操作。在这种情况下,XYZ 是一个 varchar(3)。为此,我在我的选择中使用 CASE 逻辑。我想做的是

消除所有出现的非字母/数字数据。我想要的只是大写字母和数字。在这种情况下,“where abcd = 'GROUP' then xyz 应该以 '000', '002', 'A', 'C' 消除额外的填充 Shift all Right

        abcd    xyz
1   GROUP   NULL
2   GROUP   $
3   GROUP   000000000000000000000000000000000000000000000000000000000000
4   GROUP   000000000000000000000000000000000000000000000000000000000002
5   GROUP   A
6   GROUP   C
7   GROUP   r

为此,我尝试了 TRIM 和 SUBSTR 以及其他一些不起作用的方法。我已经粘贴了我现在正在工作的内容,但我不能可靠地处理选择中的数据。我真的在寻找一些关于如何更好地在 Teradata 中使用字符串的选项。我一直在研究“SQL 函数、运算符、表达式和谓词”在线 PDF。有没有更好的参考。我们在 TD 13

SELECT abcd
        , CASE 
            -- xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
            WHEN abcd= 'GROUP'
                THEN(
                    CASE
                        WHEN SUBSTR(tx.abcd,60, 4) = 0
                            THEN (
                                    SUBSTR(tx.abcd,60, 3)
                                        )
                            ELSE
                                TRIM (TRAILING FROM tx.abcd)
                        END
                        )
            END AS abcd

FROM db.descr tx
WHERE tx.abcd IS IN ( 'GROUP')

最终结果应该是这样的

    abcd    xyz
1   GROUP   000
2   GROUP   002
3   GROUP     A
4   GROUP     C

我将不得不处理大约 60 种不同的“abcd”类型,但它们都应该符合我目前看到的数据类型.. 即.. 混合大小写、非数字、非字母、填充等。

我知道有更好的方法,但我已经在几个圈子里试图在周末解决这个问题,需要朝着正确的方向努力。

在此先感谢,帕特

4

1 回答 1

4

下面的 SQL 使用 CHARACTER_LENGTH 函数首先确定是否需要使用 Teradata 13.x 中的本机函数执行相当于 RIGHT(tx.xyz, 3) 的操作。我认为这可能会完成您想要做的事情。我希望我没有误解你的解释:

SELECT CASE WHEN tx.abcd = 'GROUP'
             AND CHARACTER_LENGTH(TRIM(BOTH FROM tx.xyz) > 3
            THEN SUBSTRING(tx.xyz FROM (CHARACTER_LENGTH(TRIM(BOTH FROM tx.xyz)) - 3))
            ELSE tx.abcd
       END
FROM db.descr tx;

编辑:修复了 SUBSTRING 中的括号

于 2012-09-17T16:32:48.950 回答