メソッドを使用Clone
して複製レコードセットを作成し、次に使用Filter
してデータセットを目的のものに縮小できます。次に例を示します。
Dim rs, rs2
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open queryString, AuthConn, adOpenKeyset, adLockReadOnly
Set rs2 = rs.Clone()
rs2.Filter = "Field1 = 'foo'"
の文字列形式Filter
は基本的です。それはかなり<Field> <op> <value>
です。AND
と を使用して複数の式を組み合わせることができますがOR
、それでもいくつかの制限があります (詳細については、ドキュメントのリンクを参照してください)。
より複雑なフィルタリングを行うには、Filter
プロパティにオブジェクトの配列を渡すことができBookmark
ます。この場合、レコードセット (またはレコードセットの複製) をループ処理し、複雑な条件で各レコードをテストします。Bookmark
レコードがテストに合格した場合は、そのレコードを配列または他のコレクションに保存します。次に、このFilter
プロパティをブックマークの配列に設定すると、カスタム フィルター処理されたレコードセットが作成されます。
'Note that I haven't tested this code
Dim rs, rs2, bookmarks
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open queryString, AuthConn, adOpenKeyset, adLockReadOnly
Set rs2 = rs.Clone()
bookmarks = Array()
Do Until rs2.EOF
If rs2("Field1") = 2 * rs2("Field2") Then
ReDim Preserve bookmarks(UBound(bookmarks) + 1)
bookmarks(UBound(bookmarks)) = rs2.Bookmark
End If
rs2.MoveNext
Loop
rs2.Filter = bookmarks
' Now rs2 contains only records where Field1 = 2*Field2
これと同じ手法を使用して、Dictionary
オブジェクトを使用して一意のキー値を格納することにより、一意の値 (別名 DISTINCT) を取得できます。複数のフィールドで DISTINCT を実行するのは少しトリッキーです。私が行ったことは、データに含まれないセパレーター (パイプなど|
) を使用して複数のフィールドを結合することです。ただし、それが常に可能であるとは限りません。