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年第三季度”
- “美国”
- “不”
这是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