DB2查询以在两个分隔符之间提取数据

时间:2017-05-08 19:28:03

标签: sql select db2 db2-luw

我需要修复不支持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

1 个答案:

答案 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