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