2017-05-26 27 views
2

所以我接受了一些髒數據結果集從多維數據集的到來, 例子:提取數據的SQL

  • [日期] [財季]。 & [2014Q3]
  • [地理包含利潤中心]。[子區域1]。 & [美國]
  • [地理包括利潤中心]。[區域]。 & [NA]

我正在尋找一種方法來提取僅什麼是最後兩個括號內,在最後一個例子 基地,我需要爲最終結果如下:

  • 「2014Q3 「

  • '美國'

  • 'NA'

這些結果來自3個不同的列,我的想法是找到一種方法將索引放在最後一個'['左方括號中,並刪除左邊的任何內容,然後刪除最後一個從它應該是「]」

這是SQL字符串,所以如何實現,這將是極好的任何幫助的性格,

+0

請參閱https://stackoverflow.com/questions/26128782/sql-server-2012-extract-regex-groups的想法。 –

回答

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 
+0

唯一不好的是,如果字段值變長,它會失敗。雖然有趣的方法。 – scsimon

+0

@scsimon同意,但只有最後一個節點是+500個字符。我會認爲這將是一個非事件:) –

+0

這一個做到了這一招,迄今爲止也是最簡單的,感謝所有幫助大家:替換(substring(SomeCol,charindex('&[',SomeCol +'& [')+2,500),']','') –

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. 它顛倒您的字段值找到]一審以相反的文本。這與最後的'['當看正常時是一樣的。這樣做,我們可以確定這個值的索引,而不管它之前有多少個括號。
  2. 一旦我們確定了,我們使用RIGHT返回從該位置到字符串末尾的所有內容。這基本上使我們留下了[yourLastBracket]
  3. 然後,我們用空字符串替換[],導致你的最終結果
+1

你也可以這樣做:select REPLACE(RIGHT(@var,CHARINDEX('[',REVERSE(@var)) - 1),']','') – TheEsnSiavashi

+1

@TheEsisia另一個好主意。我會補充說,所以OP有選擇。 – scsimon

1

你可以刪除多餘的REPLACE使用從@scsimon解決方案使用:

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; 
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將是所需要的實際子串。 ..