我有一个查询(sql-server),我试图从字符串中提取信息。
该表有3个字段(Key1 =订单号,datestamp =仅日期,logtext =字符串)。查找SQL字符串中的信息
我想要的是key1,datestamp和来自字符串的信息。我需要一些数据,包括“销售代表:”(例如:“销售代表:DSCANTL1 - > BDENNIK1”)。我在查询中显示的“salesreps”列中有我需要的内容,但是如果在logtext列中出现多个“Sales Reps”的情况,我还想显示其中的每一个。 我还希望在“销售代表:”之前出现第一个时间戳(##:##:##),并且还要在该时间戳之前的代表名称。
正如我的数据中所提供的,有时在“销售代表:”有时没有时间戳,有时候是有的。
下面是表格中数据的一个例子。
Key1 datestamp logtext
337316 2013-01-15 00:00:00.000 JWebb 10:41:19 Sales Reps: ARCHITE1 -> BDENNIK1
338644 2013-01-28 00:00:00.000 TWert 10:21:26 Sales Reps: PHEISSE1 -> PHEISSE2
305699 2013-08-23 00:00:00.000 JDickey 11:24:27 Status: no -> yesJDickey 11:25:03 SalesReps: -> NOREP JDickey 11:25:08 Status: yes -> no
360429 2014-02-10 00:00:00.000 TThomas 15:51:01 Need By: 02/20/14 -> 02/14/14 Ship By: 02/20/14 -> 02/14/14 BOatman 15:53:27 Sales Reps: TCONNOR1 -> TCONNOR1~DSIDES1
347094 2013-07-12 00:00:00.000 LLilley 10:58:07 Amount: 864 -> 876.5 Order Amount: 864 -> 876.5 LLilley 10:58:08 Total Number Releases: 2 -> 3 Total Number Releases: 3 -> 4 Sales Reps: BBARBER -> LDODGE1
337319 2013-01-15 00:00:00.000 JWebb 10:25:20 Sales Reps: ARCHITE1 -> BDENNIK1 Sales Reps: BDENNIK1 -> ARCHITE1 338524 2013-01-28 00:00:00.000 TLong 12:01:54 Sales Reps: DESIGNM1-> SPARTAN1 LLilley 11:59:07 Sales Reps: SPARTAN1 -> TKELLEY1
以下是我已经为我的查询:
已更新2014年2月14日:
;WITH cteChanges as
(
select Key1, DateStamp
,logtext
,Substring(logtext,PATINDEX('%Sales Reps:%',logtext),35) salesreps
,Substring(logtext,PATINDEX('%New Record%',logtext),10) newOrNot
,(len(logtext) - len(replace(logtext,'Sales Reps:','')))/LEN('Sales Reps:') cnt
,REVERSE(SUBSTRING(REVERSE(substring(REPLACE(Logtext, CHAR(10), '|'),0,PATINDEX('%Sales Reps:%',logtext)))
,CHARINDEX('|',REVERSE(substring(REPLACE(Logtext, CHAR(10), '|'),0,PATINDEX('%Sales Reps:%',logtext)+1))),8)) ChangeTime
,SUBSTRING(REVERSE(LEFT(REVERSE(substring(REPLACE(Logtext, CHAR(10), '|'),0,PATINDEX('%Sales Reps:%',logtext)))
,CHARINDEX('||',REVERSE(substring(REPLACE(Logtext, CHAR(10), '|'),0,PATINDEX('%Sales Reps:%',logtext))))-1)),0,10) ChangePerson
FROM chglog (nolock)
WHERE identifier = 'OrderHed' and company ='EII' and tablename = 'OrderHed'
and Logtext like '%Sales Reps:%'
and Datestamp >= '01/01/2013'
and rtrim(Left(LogText,9)) <> 'manager'
--and Substring(logtext,PATINDEX('%New Record%',logtext),10) <> 'New Record'
)
SELECT Key1 OrderNum
,DateStamp
--,logtext
,SUBSTRING(salesreps,1,PATINDEX('%-%',salesreps)) + Substring(salesreps,PATINDEX('%>%',salesreps)
,CASE WHEN (convert(int,charINDEX(char(10),Substring(salesreps,PATINDEX('%>%',salesreps),10))-1)) < 0 THEN 10 ELSE
(charINDEX(char(10),Substring(salesreps,PATINDEX('%>%',salesreps),10))-1) END) salesreps
,ChangePerson
,ChangeTime
,cnt TimesSalesPersonChanged
--,newOrNot
FROM cteChanges
ORDER BY DateStamp, Key1
这种规模的字符串操作会更适合CLR 。 – 2014-02-12 18:44:04
有没有其他想法? – Kevin
“logtext”字段中的文本是否有制表符?例如,在最后一条记录 - “... ARCHITE1 338524 2013-01-28 ...”中,时间戳之前的长空间实际上是作为选项卡存储在数据库中的吗? – Ruslan