SQL Server:提取字符串的中间部分

时间:2014-04-01 18:10:07

标签: sql-server

我在SQL Server中有一个看起来像这样的列 -

columnA
----------------------------------------------------------------------
Vendor=ABCCorp,FTPAddress=ftp.abccorp.com,Filename=index.html.yyyymmdd,Filename_Encrypted=index.html.ppg.yyyymmdd,Filename_Compressed=index.html.yyyymmdd.zip,LocalPath=\\san\folder\folder\yyyy\mm\dd,RemotePath=/

我希望能够从此列中提取Filename。问题是,由于长度的变化(供应商,ftp可能不同),我无法告诉它只是从特定点开始。

理想情况下,我希望它在第3个' ='之后开始。并在第4个'之后结束。我该怎么做?

2 个答案:

答案 0 :(得分:2)

您可以使用CHARINDEX功能获取Filename=

的位置

试试这个:

DECLARE @String VARCHAR(500)
DECLARE @SearchToken VARCHAR(25)
DECLARE @StartLocation INT
SET @String = 'Vendor=ABCCorp,FTPAddress=ftp.abccorp.com,Filename=index.html.yyyymmdd,Filename_Encrypted=index.html.ppg.yyyymmdd,Filename_Compressed=index.html.yyyymmdd.zip,LocalPath=\\san\folder\folder\yyyy\mm\dd,RemotePath=/'
SET @SearchToken = 'Filename='
SET @StartLocation = CHARINDEX(@SearchToken, @String)
SELECT SUBSTRING(@String, @StartLocation + LEN(@SearchToken), CHARINDEX(',', @String, @StartLocation) - (@StartLocation + LEN(@SearchToken)))

通过查找Filename=的位置,然后在此之后开始使用子字符串直到下一个逗号,来提取您所需的内容。

答案 1 :(得分:0)

我会创建一个用户定义的函数来拆分字符串,然后将字符串拆分两次。

这是我分割字符串的功能:

create FUNCTION [dbo].[buildTableFromSplit] ( @str  nvarchar(max), @delimiter VARCHAR(50) ) 
         RETURNS @myTable TABLE (ID int identity (1,1), split nvarchar(max))
AS    BEGIN 

DECLARE @x xml  

SELECT @X = CONVERT(xml,'<root><s>' + REPLACE(@Str,@delimiter,'</s><s>') + '</s></root>')

INSERT INTO @myTable(split)
SELECT [Value] = T.c.value('.','varchar(max)')
FROM @X.nodes('/root/s') T(c)

    return  
END

然后我会这样称呼它:

DECLARE @str VARCHAR(MAX)
SET @str = 'Vendor=ABCCorp,FTPAddress=ftp.abccorp.com,Filename=index.html.yyyymmdd,Filename_Encrypted=index.html.ppg.yyyymmdd,Filename_Compressed=index.html.yyyymmdd.zip,LocalPath=\\san\folder\folder\yyyy\mm\dd,RemotePath=/'
DECLARE @delimiter VARCHAR(50)
SET @delimiter = ','

    SELECT split FROM dbo.buildTableFromSplit((SELECT split FROM dbo.buildTableFromSplit(@str, @delimiter) WHERE LEFT(split,9) = 'FileName='), '=')
    WHERE id =2