SQL如何从字符串返回特定位置?

时间:2014-04-23 22:43:13

标签: sql-server

我有以下字符串:

declare @Request varchar(255)
set @Request= '**URGENT** Apple / Iphone/ Test/Future Resolution/Approved'

使用SQL查询,如何只返回“Apple”这个词?

我尝试过类似的东西,但它不起作用:

select substring(@Request,CharIndex('** ',@Request),charindex(' / ',@Request))

非常感谢您的投入,

洛瑞

4 个答案:

答案 0 :(得分:2)

您可以调整所需的内容以使其正确无误:

 declare @Request varchar(255)
 set @Request= '**URGENT** Apple / Iphone/ Test/Future Resolution/Approved'


 select substring(@Request,CharIndex('** ',@Request) + 3,charindex(' / ',@Request)-CharIndex('** ',@Request) -3)

基本上你的子串需要一个开始和长度,所以你需要调整你的参数。

我觉得在这里注意到,通过在某种程度上参数化分隔符然后使用LEN(first_delim)而不是硬编码3和-3,可以自然地尝试使其更通用。这里的问题是LEN()忽略了这两个分隔符中的尾随空格。如果delim是VARCHAR,你可以改为使用DATALENGTH,但是如果是NVARCHAR,你必须划分结果。

我认为值得指出的是,由于LEN适用于NVARCHAR,因此DATALENGTH本身并不存在。

SELECT LEN(N'** ') 
      ,LEN(N'** ')
      ,DATALENGTH('** ')
      ,DATALENGTH(N'** ')
      ,DATALENGTH(N'** ')/2

答案 1 :(得分:1)

试试这个:

select SUBSTRING(@request, CHARINDEX('Apple', @Request, 0), LEN('Apple'))

如果Apple只是一个例子,而你需要一个动态的,请试试这个:

select SUBSTRING(@request, CHARINDEX('** ', @Request, 0)+3, CHARINDEX(' / ', @Request, 0)-CHARINDEX('** ', @Request, 0)-3)

答案 2 :(得分:0)

第三个参数应该是您尝试提取的字符串长度。试试这个:

select substring(@Request,CharIndex('** ',@Request),charindex(' / ',@Request)-CharIndex('** ',@Request))

答案 3 :(得分:0)

这里有一些问题。首先,子串的第三个参数是子串的LENGTH,而不是最终索引。 其次,您没有考虑初始搜索字符串的长度' **'是三个字符,charindex返回字符串的START位置。 这将满足您的需求:

declare @Request varchar(255)
set @Request= '**URGENT** Apple / Iphone/ Test/Future Resolution/Approved'

select substring(@Request,charindex('** ',@Request) + 3, charIndex(' /',@Request) - charindex('** ',@Request)- 3)

因此使用+ -3以上