0

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

我的数据如下所示:

 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

谢谢你。

4

2 回答 2

3

由于您正在检查字符变量,我认为继续进行字符处理会更安全。如果您的数据行具有不同的格式,则将子字符串转换为数字时可能会出错。

换句话说,试试这个:

where substring(colname from 9 for 2) between '05' and '99'

请注意,这以“05”开头,因为您的原始问题是“大于 4”。

于 2013-05-16T21:09:32.060 回答
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% 的情况下以相同的方式工作。

于 2013-05-16T03:08:28.177 回答