【问题标题】:substring and trim in TeradataTeradata 中的子字符串和修剪
【发布时间】:2012-09-09 21:41:36
【问题描述】:

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

消除所有出现的非字母/数字数据。我想要的只是大写字母和数字。 在这种情况下,“where abcd = 'GROUP' then 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 以及其他一些不起作用的方法。我已经粘贴了我现在正在工作的内容,但我不能可靠地处理选择中的数据。我真的在寻找一些关于如何更好地在 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”类型,但它们都应该符合我目前看到的数据类型......即混合大小写、非数字、非字母、填充等。

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

提前致谢, 帕特

【问题讨论】:

    标签: sql string trim teradata


    【解决方案1】:

    下面的 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中的括号

    【讨论】:

    • 谢谢 Rob,我试过了,但是在我将它放入 SQLA 之后,我收到以下错误消息。 "非法使用字符、MCharacters 或 Octet_Length 函数。任何建议
    • 括号里都是。 :) 现在应该修好了。
    • 我刚刚隔离了那个位并将 -3 移出一个括号。感谢你的帮助。我正在将其整合到整个流程中,并会回来告诉你进展如何。我有很多疯狂的字符要整理..
    • 不客气。如果您再次碰壁,请告诉我们。我们会看看我们能做些什么来提供帮助。
    • 最后,CHARACTER_LENGTH 上的索引似乎是基于 0 的。换句话说,如果我想要返回 6 个字符的值,我必须使用 SUBSTR(.. CHARACTER_LENGTH(..)-5)。除此之外,我在 QA 中放松了它。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 2021-06-25
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多