我需要修复不支持LOCATE_IN_STRING的DB2版本的查询。该查询是一个列出文件空间名称的表,其值始终在第3和第4之间。'。该字段中的数据如下所示。
Unnamed[1]: AMER-AP-DAG\Microsoft Exchange Writer\{76fe1ac4-15f7-4bcd-987e-8e1acb462fb7}\AMER-MB-08\6bc391ef-a370-49a1-8f05-b1bed9-e5ad55
Unnamed[1]: AMER-AP-DAG\Microsoft Exchange Writer\{76fe1ac4-15f7-4bcd-987e-8e1acb462fb7}\Mailbox Database 1303547393\2bc06db2-1966-4fd7-9545-f667102b0b7d
Unnamed[1]: AMER-AP-DAG\Microsoft Exchange Writer\{76fe1ac4-15f7-4bcd-987e-8e1acb462fb7}\APAC-MB-05\11dedbd4-1757-45c8-8991-f0f713-4ef210
当我使用LOCATE时,我能得到的最好的是我需要的字符串,但它仍然包含第4个'之后的所有数据。另外正如您所看到的,字符串长度可能会有所不同,但字符串似乎总是从字符位置78开始。
Select -
SUBSTR(FILESPACE_NAME, LOCATE('\',FILESPACE_NAME, LOCATE('\',FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME)+1)+1)-1)+1) -
as FSNAME -
from filespaces -
where node_name='AMER-AP-DAG'
FSNAME:AMER-MB-08 \ 6bc391ef-a370-49a1-8f05-b1bed9e5ad55
FSNAME:邮箱数据库1143943276 \ 55ac1670-efc9-4301-ac5c-beb5cd2d77cb
FSNAME:APAC-MB-05 \ 11dedbd4-1757-45c8-8991-f0f7134ef210
答案 0 :(得分:0)
以下查询将为您提供第三个和第四个反斜杠之间的字符:
Select -
SUBSTR(FILESPACE_NAME, -
LOCATE('\',FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME)+1)+1)+1, -
LOCATE('\',FILESPACE_NAME, -
LOCATE('\',FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME)+1)+1)+1)- -
LOCATE('\',FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME, -
LOCATE('\', FILESPACE_NAME)+1)+1)-1) -
as FSNAME -
from filespaces -
where node_name='AMER-AP-DAG'
工作原理:
要获取分隔所需文本的反斜杠的位置,您使用的是LOCATE函数,它具有参数(1)搜索字符串,(2)源字符串和(3)可选的起始位置。
LOCATE语句正在查找反斜杠的位置,然后使用以下字符作为起点来查找下一个反斜杠:
{i}第一个反斜杠后面的字符位置=
LOCATE('\', FILESPACE_NAME)+1
{ii}第二个反斜杠后面的字符位置=
LOCATE('\', FILESPACE_NAME, LOCATE('\', FILESPACE_NAME)+1)+1
{iii}第三个反斜杠后面的字符位置=
LOCATE('\',FILESPACE_NAME, LOCATE('\', FILESPACE_NAME, LOCATE('\', FILESPACE_NAME)+1)+1)+1
{iv}第四个反斜杠后面的字符位置=
LOCATE('\',FILESPACE_NAME, LOCATE('\',FILESPACE_NAME, LOCATE('\', FILESPACE_NAME, LOCATE('\', FILESPACE_NAME)+1)+1)+1)+1
要在反斜杠之间提取文本,您使用的是SUBSTR函数,它具有参数(1)字符串表达式,(2)起始位置和(3)可选长度。
因此,要获取第三个和第四个反斜杠之间的字符,只需设置
即可start =第三个反斜杠之后的第一个字符
= {iii}
和
length =第三个和第四个反斜杠之间的字符数 =第四个反斜杠的位置 - 第三个反斜杠的位置 - 1
= ({iv} - 1) - ({iii} - 1) - 1