仅在VARCHAR中显示某些序列

时间:2016-05-04 16:37:52

标签: sql oracle

我有一个列error_desc,其值为:

(Class :: Method)xxxxCalcModule :: endCustomer中发生了故障。对于日期20160XXX,风扇ID 111232在BL9_XXXXX中无效或不存在。

我可以使用哪种SQL查询来显示该列中的数字111232?该数字位于VARCHAR列的第66位,结束于第71位。

2 个答案:

答案 0 :(得分:0)

SELECT substr(ERROR_DESC,66,6) as ABC FROM bl1_cycle_errors where error_desc like '%FAN%'

答案 1 :(得分:0)

此解决方案使用正则表达式。

我面临的挑战是拔出字母数字。在这种情况下,我们必须只保留数字并过滤掉字符串,字母数字或标点,以检测独立数字。

纯字符串和不包含数字的单词可以使用

轻松过滤掉
[^[:digit:]]

字母数字的可能组合是: 1.带有字符的开头,包含数字,可能以字符或标点结尾:

[a-zA-Z]+[0-9]+[[:punct:]]*[a-zA-Z]*[[:punct:]]*

2.带数字然后包含字母,可能包含标点:

[0-9]+[[:punct:]]*[a-zA-Z]+[[:punct:]]*
  1. 从数字开始然后包含标点符号,可能包含字母:

    - [0-9] + [a-zA-Z] [[:punct:]] + [a-zA-Z] - 无法突出显示代码,参考解决方案的最后一个正则表达式组合

  2. 使用|组合这些正则表达式我们得到的运营商:

    select trim(REGEXP_REPLACE(error_desc,'[^[:digit:]]|[a-zA-Z]+[0-9]+[[:punct:]]*[a-zA-Z]*[[:punct:]]*|[0-9]+[[:punct:]]*[a-zA-Z]+[[:punct:]]*|[0-9]+[a-zA-Z]*[[:punct:]]+[a-zA-Z]*',' '))
    from error_table;
    

    在大多数情况下都可以使用。