子串,Charindex

时间:2017-05-18 11:23:18

标签: sql sql-server-2012

我正在尝试提取在前两个下划线之后和表中字段中第三个下划线之前存在的长度不同的代码。该表看起来像这样。有超过30个代码,我需要提取代码作为查询的一部分。

code
====
XX_YYY_CODE1_ZZZ
XX_YYY_CODE2_ZZZ
XX_YYY_CODE3_ZZZ
XX_YYY_CODE4_ZZZ
...

我已经尝试过使用这段代码但是这给了我YYY而不是我之后的CODE而且我无法弄清楚如何重新设计它来做我想做的事。

select 
left(SUBSTRING(code, 
CHARINDEX('_', code) + 1, len(code)), 
CHARINDEX('_',SUBSTRING(code,CHARINDEX('_', code) + 2, LEN(code)))) 

6 个答案:

答案 0 :(得分:4)

如果只有四个下划线,请使用以下代码

select parsename(replace('1_2_3_4','_','.'),2) 

答案 1 :(得分:0)

请尝试使用此表达式:

SELECT SUBSTRING
(code, 
  CHARINDEX('_', code, CHARINDEX('_', code) + 1) + 1, 
  LEN(code) - 
  (CHARINDEX('_', code, CHARINDEX('_', code) + 1) + 1) -
  CHARINDEX('_',REVERSE(code))
)

答案 2 :(得分:0)

使用下面的代码,我希望它能给出你期望的结果:

 CREATE TABLE #Table(GvnString VARCHAR(100))

 INSERT INTO #Table( GvnString )
 SELECT 'XX_YYY_Code1_ZZZ' UNION ALL
 SELECT 'XX_YYY_Code2_ZZZ' UNION ALL
 SELECT 'XX_YYY_Code3_ZZZ' UNION ALL
 SELECT 'XX_YYY_Code4_ZZZ' 

 SELECT SUBSTRING(GvnString, CHARINDEX('_', GvnString, CHARINDEX('_', 
        GvnString) + 1) + 1, LEN(GvnString) - CHARINDEX('_', GvnString, 
        CHARINDEX('_', GvnString) + 1))
 FROM #Table

答案 3 :(得分:0)

我正在反转字符串并执行子字符串操作。

 CREATE TABLE #MyTable(Code VARCHAR(50))

 INSERT INTO #MyTable( Code)
 SELECT 'XX_YYY_Code1_ZZZ' UNION ALL
 SELECT 'XX_YYY_Code2_ZZZ' UNION ALL
 SELECT 'XX_YYY_Code3_ZZZ' UNION ALL
 SELECT 'XX_YYY_Code4_ZZZ' 

select Reverse(Substring
(substring (Reverse(code),charindex('_',Reverse(code))+1,Len(code)),0,
CHARINDEX('_',substring (Reverse(code),charindex('_',Reverse(code))+1,Len(code)))))
from #Table

答案 4 :(得分:0)

刚刚修改了你的代码。它应该工作。

select 
SUBSTRING(
substring(substring(code,CHARINDEX('_', code)+1,len(code))
,CHARINDEX('_', substring(code
,CHARINDEX('_', code)+1,len(code)))+1
,len(code)),1,
LEN(substring(substring(code,CHARINDEX('_', code)+1,len(code))
,CHARINDEX('_', substring(code
,CHARINDEX('_', code)+1,len(code)))+1
,len(code)))
- len(substring(substring(substring(code,CHARINDEX('_', code)+1,len(code))
,CHARINDEX('_', substring(code
,CHARINDEX('_', code)+1,len(code)))+1
,len(code)),CHARINDEX('_', substring(substring(code,CHARINDEX('_', code)+1,len(code))
,CHARINDEX('_', substring(code
,CHARINDEX('_', code)+1,len(code)))+1
,len(code)))+1,
LEN(substring(substring(code,CHARINDEX('_', code)+1,len(code))
,CHARINDEX('_', substring(code
,CHARINDEX('_', code)+1,len(code)))+1
,len(code)))))-1)

答案 5 :(得分:0)

来自dotNET的略微修改的答案可以满足我的需求。以下示例;

SELECT SUBSTRING
('XX_YYY_LongCode_ZZZ', 
  CHARINDEX('_', 'XX_YYY_LongCode_ZZZ', CHARINDEX
  ('_', 'XX_YYY_LongCode_ZZZ') + 1) + 1, 
  LEN('XX_YYY_LongCode_ZZZ') - 
  (CHARINDEX('_', 'XX_YYY_LongCode_ZZZ', CHARINDEX   
  ('_', 'XX_YYY_LongCode_ZZZ') + 1)) -
  CHARINDEX('_',REVERSE('XX_YYY_LongCode_ZZZ'))
)

或另一个例子

SELECT SUBSTRING
('XX_YYY_otherCode_ZZZ', 
  CHARINDEX('_', 'XX_YYY_otherCode_ZZZ', CHARINDEX    
  ('_', 'XX_YYY_otherCode_ZZZ') + 1) + 1, 
  LEN('XX_YYY_otherCode_ZZZ') - 
  (CHARINDEX('_', 'XX_YYY_otherCode_ZZZ', CHARINDEX 
  ('_', 'XX_YYY_otherCode_ZZZ') + 1)) -
  CHARINDEX('_',REVERSE('XX_YYY_otherCode_ZZZ'))
)