2017-05-18 32 views
0

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

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

,你是干什么的预期产出? – Mansoor

+0

所有值都有三个下划线吗?你能提供更好的数据样本吗?因为长度相同,'substring()'要简单得多。 –

+0

我对所寻找的东西略有不清楚的道歉。每次有相同数量的下划线和长度不等的20-30个代码。 –

回答

0

试试这个表达式来代替:下面的代码

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

感谢dotNET我稍微修改了这个以获得所需的内容。 –

+0

@MikeR:很高兴听到。如果您认为这回答了您的问题,请将此标记为帮助未来读者的答案。 – dotNET

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

如果只有四下划线,使用下面的代码

select parsename(replace('1_2_3_4','_','.'),2) 
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) 
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')) 
)