如何获得列的一部分的长度?

时间:2016-02-11 10:12:54

标签: sql oracle11g

我的表格中有一列name,其值为PERIOD@1|COLTAB@0.0.1.0.0.0.0.1.0|VOLIDCOLTAB@*1.1.0.0.0.0.1.1.1.0.0.1.1.1.0.1*|UTC@0|IDVOL@1

在简单的VOLIDCOLTAB@

中,我需要计算从|到下一个PERIOD@1|COLTAB@0.0.1.0.0.0.0.1.0|VOLIDCOLTAB@**1.1.0.0.0.0.1.1.1.0.0.1.1.1.0.1**|UTC@0|IDVOL@1的长度

我怎样才能在SQL中执行此操作?

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式提取相关的分隔部分,例如:

regexp_substr(name, 'VOLIDCOLTAB@[^|]+')

匹配任何以VOLIDCOLTAB@开头的内容,后跟除了条形分隔符以外的任意数量的字符。

然后您可以获得该长度,并减去固定前缀的长度:

select regexp_substr(name, 'VOLIDCOLTAB@[^|]+') as part,
  length(regexp_substr(name, 'VOLIDCOLTAB@[^|]+')) as part_length,
  length(regexp_substr(name, 'VOLIDCOLTAB@[^|]+'))
    - length('VOLIDCOLTAB@') as subpart_length
from your_table;

PART                                          PART_LENGTH SUBPART_LENGTH
--------------------------------------------- ----------- --------------
VOLIDCOLTAB@*1.1.0.0.0.0.1.1.1.0.0.1.1.1.0.1*          45             33

如果您愿意,可以包含上一个分隔符,但是您需要在正则表达式模式中转义该条形符号:

select regexp_substr(name, '\|VOLIDCOLTAB@[^|]+') as part,
  length(regexp_substr(name, '\|VOLIDCOLTAB@[^|]+')) as part_length,
  length(regexp_substr(name, '\|VOLIDCOLTAB@[^|]+'))
    - length('|VOLIDCOLTAB@') as subpart_length
from your_table;

PART                                           PART_LENGTH SUBPART_LENGTH
---------------------------------------------- ----------- --------------
|VOLIDCOLTAB@*1.1.0.0.0.0.1.1.1.0.0.1.1.1.0.1*          46             33

如果您出于某种原因不想使用正则表达式,可以使用substrinstr代替,但它会使代码更长一些,更难以阅读:

select substr(name,
    instr(name, '|VOLIDCOLTAB@'),
    instr(substr(name, instr(name, '|VOLIDCOLTAB@')), '|', 1, 2) - 1) as part,
  length(substr(name,
    instr(name, '|VOLIDCOLTAB@'),
    instr(substr(name, instr(name, '|VOLIDCOLTAB@')), '|', 1, 2) - 1)) as part_length,
  length(substr(name,
    instr(name, '|VOLIDCOLTAB@'),
    instr(substr(name, instr(name, '|VOLIDCOLTAB@')), '|', 1, 2) - 1))
    - length('|VOLIDCOLTAB@') as subpart_length
from your_table;

PART                                           PART_LENGTH SUBPART_LENGTH
---------------------------------------------- ----------- --------------
|VOLIDCOLTAB@*1.1.0.0.0.0.1.1.1.0.0.1.1.1.0.1*          46             33