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

时间:2017-05-26 18:42:36

标签: sql sql-server tsql sql-server-2012

所以我收到来自多维数据集的结果集的一些脏数据, 示例:

  • [日期]。[财政季]。& [2014Q3]
  • [地理利润中心]。[次地区1]。& [美国]
  • [地理利润中心]。[地区]。& [NA]

我正在寻找一种方法来仅提取最后两个括号内的内容, 基于最后一个例子,我需要作为最终结果如下:

  • '2014Q3'

  • '美国'

  • 'NA'

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

的字符串

这是SQL,所以关于如何实现这一目标的任何帮助都会非常好,

4 个答案:

答案 0 :(得分:2)

以下是一个示例。它适用于所有测试用例。当然,只需将@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

工作原理

  1. 它会反转您的字段值,以便在反向文本中找到]的第一个实例。这与上一次' ['看着它正常。这样做,无论前面有多少个括号,我们都可以id这个值的索引。
  2. 一旦我们确定了这一点,我们就会使用RIGHT返回从此位置到字符串末尾的所有内容。这基本上留给我们[yourLastBracket]
  3. 然后,我们用空字符串替换[],从而产生最终结果

答案 1 :(得分:1)

又一个选择

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

答案 2 :(得分:1)

您可以使用以下命令从@scsimon解决方案中删除额外的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;

答案 3 :(得分:0)

Select Reverse(string2) from(Select Left(string1,charindex('[',string1)-1) as string2 from ( Select Left(Reverse(column),len(column)-1) as string1 )L)F

字符串1将是没有最后方括号的输入字符串,也是反向形式。

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

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