由于工作需求,需要在SQL查询结果的字符串中找出相同的数字,
表名:Table
结构如下:
id, Title, Content
1, A, nvarchar(max)
2, B, nvarchar(max)
其中Content中存的是以逗号相隔的数字,数字顺序排列,不会重复,单条的数据量非常大,几万级别,格式如下:
1,23,45,678,2323,2615,6325,23232......
32,45,128,2323,2615,2861,13512,16802.......
现在要处理的是:
在上面查询到的2个结果中,将Content里面的值相同的数字取出来,并存为以下格式:
45,2323,2615
解决思路:
1、排序:由于字符串是由数字组成,先对查询结果的字符串中的数字进行排序处理,排序函数VBS代码如下:
'排序
Function SortNum(NumList)
Dim oArrayList, iElement
Set oArrayList = CreateObject("System.Collections.ArrayList")
Dim thisArray
thisArray = Split(NumList, ",")
For iElement = 0 To UBound(thisArray)
oArrayList.Add CLng(thisArray(iElement))
Next
oArrayList.Sort '通过ArrayList的Sort方法对数组进行排序
thisArray = oArrayList.toArray
SortNum = join(thisArray, ",") '返回字符串
End Function
如果数字是有规则的顺序排序的话,则不需要使用此排序函数。
http://blog.csdn.net/aminfo/article/details/22955059
2、交集:将排序好的字符串转换成数组,然后进行交集处理,以下为交集函数vbs代码:
'对2组字符串进行交集处理
Function GetSameNum(IdStrA, IdStrB)
GetSameNum = ""
Dim tmpArrayA, tmpArrayB
Dim ALength, BLength
Dim iA, iB
tmpArrayA = Split(IdStrA, ",") '将字符串转为数组
ALength = ubound(tmpArrayA)
iA = 0
tmpArrayB = Split(IdStrB, ",") '将字符串转为数组
BLength = ubound(tmpArrayB)
iB = 0
do while True
If iA>ALength Then
Exit Do
ElseIf iB>BLength Then
Exit Do
End If
ValueA = Clng(tmpArrayA(iA))
ValueB = Clng(tmpArrayB(iB))
do while ValueA > ValueB
iB = iB + 1
If iB > BLength Then
Exit Do
End If
ValueB = Clng(tmpArrayB(iB))
Loop
do while ValueA < ValueB
iA = iA + 1
If iA > ALength Then
Exit Do
End If
ValueA = Clng(tmpArrayA(iA))
Loop
If ValueA = ValueB Then
GetSameNum = GetSameNum & "," & ValueA
iA = iA + 1
iB = iB + 1
End If
Loop
If GetSameNum<>"" Then
GetSameNum = Right(GetSameNum, Len(GetSameNum)-1)
End If
End Function
字符串A转为数组后长度为:51271
字符串B转为数组后长度为:79017
将以上两个字符串进行交集处理所消耗时间:179.688毫秒