DB2 查询以提取两个定界符之间的数据

DB2 query to extract data between two delimiters

我需要修复不支持 LOCATE_IN_STRING 的 DB2 版本的查询。查询是 table 的查询,其中列出了文件 space 名称,值始终在第 3 个和第 4 个“\”之间。该字段中的数据如下所示。

Unnamed[1]: AMER-AP-DAG\Microsoft Exchange Writer\{76fe1ac4-15f7-4bcd-987e-8e1acb462fb7}\AMER-MB-08bc391ef-a370-49a1-8f05-b1bed9-e5ad55

Unnamed[1]: AMER-AP-DAG\Microsoft Exchange Writer\{76fe1ac4-15f7-4bcd-987e-8e1acb462fb7}\Mailbox Database 1303547393bc06db2-1966-4fd7-9545-f667102b0b7d

Unnamed[1]: AMER-AP-DAG\Microsoft Exchange Writer\{76fe1ac4-15f7-4bcd-987e-8e1acb462fb7}\APAC-MB-05dedbd4-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-08bc391ef-a370-49a1-8f05-b1bed9e5ad55

FSNAME:邮箱数据库1143943276ac1670-efc9-4301-ac5c-beb5cd2d77cb

FSNAME:APAC-MB-05dedbd4-1757-45c8-8991-f0f7134ef210

以下查询将为您提供第三个和第四个反斜杠之间的字符:

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