Sql 从最后两个方括号中提取数据

Sql 从最后两个方括号中提取数据,sql,sql-server,tsql,sql-server-2012,Sql,Sql Server,Tsql,Sql Server 2012,因此,我收到一些来自多维数据集的脏数据作为结果集, 例如: 【日期】【会计季度】和【2014年第三季度】 [地理位置,包括利润中心][分区域1]和[美国] [地理位置,包括利润中心][地区]和[NA] 我正在寻找一种只提取最后两个括号内的内容的方法, 根据最后一个示例,我需要以下结果: “2014年第三季度” “美国” “不” 这些结果来自3个不同的列,我的想法是找到一种方法,将索引放在最后一个“[”左方括号中,删除左边的任何内容,然后从字符串中删除最后一个字符,它应该是“]” 这是SQ

因此,我收到一些来自多维数据集的脏数据作为结果集, 例如:

  • 【日期】【会计季度】和【2014年第三季度】
  • [地理位置,包括利润中心][分区域1]和[美国]
  • [地理位置,包括利润中心][地区]和[NA]
我正在寻找一种只提取最后两个括号内的内容的方法, 根据最后一个示例,我需要以下结果:

  • “2014年第三季度”

  • “美国”

  • “不”

这些结果来自3个不同的列,我的想法是找到一种方法,将索引放在最后一个“[”左方括号中,删除左边的任何内容,然后从字符串中删除最后一个字符,它应该是“]”


这是SQL,因此关于如何实现这一点的任何帮助都将非常好,

这里有一个示例。它适用于所有测试用例。当然,只要用您的列名替换
@var

declare @table table (bracketColumn varchar(64))
insert into @table
values
('[Geography Incl Profit Center].[Sub-Region1].&[United States]'),
('[Dates].[Fiscal Quarter].&[2014Q3]'),
('[Geography Incl Profit Center].[Region].&[NA]')

select 
    replace(
            replace(
                    right(bracketColumn,charindex('[',reverse(bracketColumn)))
                    ,'[','')
            ,']','')
from
    @table
它的工作原理

  • 它反转您的字段值,以在反转文本中查找第一个
    ]
    实例。这与上一个“[”在正常情况下是一样的。这样做,我们就可以识别这个值的索引,而不管它前面有多少个括号
  • 一旦我们确定了这个位置,我们就使用
    RIGHT
    返回从这个位置到字符串末尾的所有内容。这基本上给我们留下了
    [yourLastBracket]
  • 然后,我们用空字符串替换
    [
    ]
    ,得到最终结果
  • 另一种选择

    Declare @YourTable table (SomeCol varchar(max))
    Insert Into @YourTable values
    ('[Dates].[Fiscal Quarter].&[2014Q3]'),
    ('[Geography Incl Profit Center].[Sub-Region1].&[United States]'),
    ('[Geography Incl Profit Center].[Region].&[NA]'),
    ('[Geography Incl Profit Center].[Region]')        -- No Value
    
    Select SomeVal = replace(substring(SomeCol,charindex('&[',SomeCol+'&[')+2,500),']','')
     From  @YourTable A
    
    返回

    SomeVal
    2014Q3
    United States
    NA
    

    您可以使用以下方法从@scsimon solution中删除额外的
    REPLACE
    用法:

    declare @table table (bracketColumn varchar(64))
         insert into @table
         values
         ('[Geography Incl Profit Center].[Sub-Region1].&[United States]'),
         ('[Dates].[Fiscal Quarter].&[2014Q3]'),
         ('[Geography Incl Profit Center].[Region].&[NA]')
    
    
    SELECT REPLACE(RIGHT(bracketColumn, CHARINDEX('[', REVERSE(bracketColumn))-1), ']', '') 
    FROM @table;
    
    字符串1将是不带最后一个方括号的输入字符串,并且形式相反

    字符串2将是反向字符串的子字符串,直到第一次出现方括号-1的位置。(实际要求,但仍处于反向状态)


    字符串3将是所需的实际子字符串…

    请参阅以了解想法。您也可以这样做:选择替换(右(@var,CHARINDEX('[',反向(@var))-1),']',')另一个好主意是@Theessia。我想把它作为一个答案,这样OP就有了选项。唯一的坏处是,如果字段值变长,它将失败。不过这是一个有趣的方法。@scsimon同意,但前提是最后一个节点是+500个字符。我认为这将是一个非事件:)这一个成功了,到目前为止也是最简单的,谢谢大家帮助所有人:替换(子串(SomeCol,charindex('&[',SomeCol+'&[')+2500),']','')@JuanCarlosArayaPortuguez,很高兴它有帮助
    Select Reverse(string2) from(Select Left(string1,charindex('[',string1)-1) as string2 from ( Select Left(Reverse(column),len(column)-1) as string1 )L)F