子串选择两个字符之间的字符串

时间:2014-06-24 17:54:48

标签: sql-server

以下代码

declare @text VARCHAR(MAX) 
set @text='[Dim Company].[Company].[23]'
SELECT SUBSTRING(@Text, CHARINDEX('[Dim Company].[Company].[', @Text)
, CHARINDEX(']',@text) - CHARINDEX('[Dim Company].[Company].[', @Text) + Len(']'))

返回[Dim Company]。我希望它能在最后[]之间返回整数 - 在本例中为23。我怎样才能获得所需的字段?

3 个答案:

答案 0 :(得分:0)

如果您知道它始终持续,为什么不{@ 1}}字符串,找到第一个括号对之间的值,然后REVERSE结果?

比嵌套REVERSE电话容易得多。

答案 1 :(得分:0)

这将为您提供23]

SELECT RIGHT(@text, CHARINDEX('[',REVERSE(@text))-1)

这将为您提供23

SET @tmp = RIGHT(@text, CHARINDEX('[',REVERSE(@text))-1)
SET @tmp = LEFT(@tmp, LEN(tmp)-1)

小提琴:http://sqlfiddle.com/#!3/d41d8/36013

答案 2 :(得分:-1)

我同意mwigdahl,这是做事的坏方法,但这就是你寻求的答案:

declare @text VARCHAR(MAX) 
set @text='[Dim Company].[Company].[23]'
SELECT SUBSTRING(@Text, 
                 LEN('[Dim Company].[Company].[')+1,
                 LEN(@text)-LEN('[Dim Company].[Company].[')-1)

更好的方法是使用PARSENAME()函数。该函数的目的实际上是解析对象名称,例如server.schema.table,但由于您的字符串看起来就像那样,我们可以劫持该函数。它比charindex / substring更有效,更清洁。

declare @text varchar(max), @p1 varchar(max), @p2 varchar(max), @p3 varchar(max)
set @text='[Dim Company].[Company].[23]'                 
set @p1 = PARSENAME(@text, 3)
set @p2 = PARSENAME(@text, 2)
set @p3 = PARSENAME(@text, 1)

select @p1, @p2, @p3
相关问题