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