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

Sql server 子字符串选择两个字符之间的字符串,sql-server,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]。我希望它返

下面的代码

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。如何获取所需字段?

如果知道它总是最后一个字段,为什么不反转字符串,在第一对括号之间找到值,然后反转结果

比嵌套CHARINDEX调用容易得多。

这将为您提供23]

这会给你23分


小提琴:

我同意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更高效、更干净


问题是最后一个[]之间的信息-没有说明之前有多少个。如果上面说你的名字可能是个不错的黑客,我想你是对的。他硬编码了charindex,所以我假设它总是3组,前2组是静态的。
SET @tmp = RIGHT(@text, CHARINDEX('[',REVERSE(@text))-1)
SET @tmp = LEFT(@tmp, LEN(tmp)-1)
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)
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