【发布时间】: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”类型,但它们都应该符合我目前看到的数据类型......即混合大小写、非数字、非字母、填充等。
我知道有更好的方法,但我在周末转了好几个圈子试图解决这个问题,需要朝着正确的方向努力。
提前致谢, 帕特
【问题讨论】: