2016-12-08 115 views
0

我有如下所示的数据。我想检索下划线之间的数据。下划线两边的数据可以是任意长度。我从包含数千行的表中选择这些数据,并在整个查询中选择其他数据。任何人都可以请帮忙。SQL选择字符串中两个字符之间的数据

列名是d.ThirdPartyRef

2500_NEW_001 

我已经从上述字段的左侧选择的数据使用以下的另一列。

substring(d.ThirdPartyRef, 1, charindex('_', d.ThirdPartyRef)-1) as CarrierCode_DayNumber 

感谢

+0

什么数据库,你真的使用?你的问题被标记为MySQL,但代码看起来像SQL Server。基于代码工作的想法,我将标记更改为sql-server。 –

+0

嗨,没错,它的SQL服务器,为改变而欢呼。 –

+0

您的预计结果来自于2500_NEW_001? –

回答

0

如果你能保证值将仅包含两个下划线:

DECLARE @ThirdPartyRef VARCHAR(50) 
SET @ThirdPartyRef = '2500_NEW_001' 

SELECT @ThirdPartyRef AS Value, 
     CHARINDEX('_',@ThirdPartyRef) AS FirstUnderscore, 
     CHARINDEX('_',@ThirdPartyRef,CHARINDEX('_',@ThirdPartyRef)+1) AS SecondUnderscore, 
     SUBSTRING(@ThirdPartyRef, CHARINDEX('_',@ThirdPartyRef) + 1, CHARINDEX('_',@ThirdPartyRef,CHARINDEX('_',@ThirdPartyRef)+1) - CHARINDEX('_',@ThirdPartyRef) - 1) AS Result 

结果:

/------------------------------------------------------------\ 
|  Value | FirstUnderscore | SecondUnderscore | Result | 
|--------------+-----------------+------------------+--------| 
| 2500_NEW_001 |  5  |   9  | NEW | 
\------------------------------------------------------------/ 

FirstUnderscoreSecondUnderscore列只是为了说明解决方案的工作原理。

+0

3N1GM4这是完美的,非常感谢! –

1

您可以使用PARSENAME()

Declare @YourTable table (ID int,ThirdPartyRef varchar(500)) 
Insert Into @YourTable values 
(1,'2500_NEW_001'), 
(2,'2500_OLD_002') 

Select A.* 
     ,Pos1=ParseName(Replace(ThirdPartyRef,'_','.'),3) 
     ,Pos2=ParseName(Replace(ThirdPartyRef,'_','.'),2) 
     ,Pos3=ParseName(Replace(ThirdPartyRef,'_','.'),1) 
From @YourTable A 

返回

ID ThirdPartyRef Pos1 Pos2 Pos3 
1 2500_NEW_001 2500 NEW  001 
2 2500_OLD_002 2500 OLD  002 
+0

有趣的是,之前没有看到过'PARSENAME' - 看起来这不是预期的用法,因为它被设计为具有作为第一个参数传递的'sysname',对吧?但是,如果您希望分割的值有4个或更少的“碎片”,但看起来确实是一种很好的解决此类问题的方法。 – 3N1GM4

+1

@ 3N1GM4你是对的。这是有限的。我绝对更喜欢我的解析函数,但人们倾向于抵制UDF,无论它们的速度和功能如何。 –

相关问题