在字符串上提取数字并用作过滤器

时间:2013-05-15 23:27:45

标签: sql substring where teradata

我想在字符串中提取一个数字并将其用作过滤器。

我的数据如下:

 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

谢谢。

2 个答案:

答案 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%的情况下,它们应该以相同的方式工作。