Teradata中的子串和修剪

时间:2012-09-17 16:15:08

标签: sql string trim teradata

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

消除所有非字母/数字数据的出现。我想要的只是大写的Alpha字符和数字。 在这种情况下“其中abcd ='GROUP'然后xyz应该出现'000','002','A','C' 消除额外的填充 把一切都改正了

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

要做到这一点,我尝试过TRIM和SUBSTR以及其他一些无效的东西。我已经粘贴了我现在正在处理的内容,但是我没有可靠地处理select中的数据。我真的在寻找一些如何更好地使用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”类型,但它们都应该符合我目前看到的数据类型..即..混合大小写,非数字,非字母,填充等。

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

提前致谢, 专利

1 个答案:

答案 0 :(得分: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中的固定括号