繁体   English   中英

子串,Charindex

[英]Substring, Charindex

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

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

我已经尝试过使用此代码,但是这给了我YYY而不是我所追求的代码,我无法解决如何对其进行重新设计以完成我想做的事情。

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

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

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

尝试使用以下表达式:

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

使用下面的代码,希望它能给您预期的效果:

 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

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

 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

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

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)

从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'))
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM