[英]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.