2016-12-08 119 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,無論它們的速度和功能如何。 –

相關問題