从自由文本字段中提取多个字符串

时间:2016-07-02 19:39:51

标签: sql substring charindex

我们说我有一个名为' Note'的自由文字字段。并包含" ABC:5/52,*返回,已收到订单"

如何提取' 5/52'和'回来'并将它们分成两列?

这就是我想要实现的目标

QUERY:-

SELECT *,  SUBSTRING(Note, CHARINDEX(':', Note)+1, 4) as ABC, 
SUBSTRING(Note, CHARINDEX('*', Note)+1, 4) as Ret_Stat
, CHARINDEX(':', Note) AS [Colon Index]

FROM [AdventureWorks2012].[Sales].[Comments]

RESULT:-
Note                                           ABC      Ret_Stat
ABC:3/52,  To give more explanation, *back     3/52      back
ABC:3wks,  To debrief, *back, r/v              3wks      back
ABC:13/09/16, see cm,  *back, new referral     13/0      back

我的问题是我想提取3/52,3wks和13/09/16,但我的最终结果只有13/10。 我想问一下如何做到这一点?因为提取的条件可能在ABC之后从4到8个字符变化:并且该表包含数千行数据

需要建议。谢谢你。

1 个答案:

答案 0 :(得分:0)

以下是您要做的事情的示例。您可能需要稍微修改一下,因为我没有大量的样本数据可供使用。

测试数据

IF OBJECT_ID('tempdb..#TempData') IS NOT NULL DROP TABLE #TempData
GO
CREATE TABLE #TempData (Notes varchar(100))
INSERT INTO #TempData (Notes)
VALUES
 ('This is the first "ABC:5/52 string *back, orders received')
,('*back, orders receivedThis"ABC:5/52 string is the second one')
,('You guessed it, this *back, orders received is the third "ABC:5/52 string')

查询

SELECT
 CHARINDEX('*',Notes) AsteriskLocation
,SUBSTRING(Notes,CHARINDEX('*',Notes)+1,4) AfterAsterisk
,CHARINDEX(':',Notes) ColonLocation
,SUBSTRING(Notes,CHARINDEX(':',Notes)+1,4) AfterColon
FROM #TempData

结果

AsteriskLocation    AfterAsterisk   ColonLocation   AfterColon
36                  back            23              5/52
1                   back            31              5/52
22                  back            62              5/52

我已单独离开这些位置,以便您可以查看它们在查询中的使用方式。您也可以使用相同的方法搜索字符串。