我想在字符串中提取一个数字并将其用作过滤器。
我的数据如下:
AAAA_01_01_AAA
BBBB_01_02_BBB
CCCC_01_03_CCC
DDDD_01_04_DDD
我想提取第二组数字[01,02,03,04]并将其用作下面的过滤器
where substr(colname,9,2) > 4
它给我一个错误
2621: Bad character in format or data of TVM.TVMName
我尝试将其转换为整数,如下所示,但没有运气。
where cast(substr(colname,9,2) as int) > 4
谢谢。
答案 0 :(得分:3)
由于您正在检查字符变量,我认为继续进行字符处理会更安全。如果您的数据行具有不同的格式,则可能会将子字符串转换为数字时出错。
换句话说,试试这个:
where substring(colname from 9 for 2) between '05' and '99'
请注意,这从“05”开始,因为您的原始问题是“大于4”。
答案 1 :(得分:2)
您是否考虑过使用POSITION()
功能:
SELECT TVMName
FROM DBC.TVM
WHERE POSITION('04' IN TVMName) = 9;
修改强>
误读了你的问题。以下SQL将SUBSTRING的输出转换为SMALLINT:
SELECT 'DDDD_01_04_DDD'
, CAST(SUBSTRING('DDDD_01_04_DDD' FROM 9 FOR 2) AS SMALLINT) AS Token_
WHERE Token_ > 4;
此查询不返回任何行,因为Token_实际上是4。
您是否尝试SUBSTRING()
支持Teradata扩展程序SUBSTR()
?在99%的情况下,它们应该以相同的方式工作。