【问题标题】:Extract number on string and use as filter提取字符串上的数字并用作过滤器
【发布时间】:2013-05-10 17:00:31
【问题描述】:

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

我的数据如下所示:

 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

谢谢。

【问题讨论】:

  • 这是哪个 DBMS? SQL 服务器? MySQL?
  • cast() 版本有什么问题?
  • 仍然收到相同的错误 2621:TVM.TVMName 的格式或数据中出现错误字符

标签: sql substring where teradata


【解决方案1】:

您是否考虑过使用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% 的情况下都以相同的方式工作。

【讨论】:

  • 我需要提取文本中的整数值。我不认为位置函数会给我正确的输出。
【解决方案2】:

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

换句话说,试试这个:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2022-01-16
    • 2021-11-07
    • 2011-03-03
    • 2015-06-09
    相关资源
    最近更新 更多