我的表格中有一列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中执行此操作?
答案 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
如果您出于某种原因不想使用正则表达式,可以使用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