Sql 如何获取部分列的长度?

Sql 如何获取部分列的长度?,sql,oracle11g,Sql,Oracle11g,我的表中有一列名称,其值为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.1.1.1.0.0.1.1.1.0.1**|UTC@0|IDVOL@1 如何在SQL中执行此操作?您可以使用

我的表中有一列
名称
,其值为
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.1.1.1.0.0.1.1.1.0.1**|UTC@0|IDVOL@1


如何在SQL中执行此操作?

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

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

如果出于某种原因不想使用正则表达式,可以使用
substr
instr
来代替,但这会使代码变得更长、更难阅读:

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