今回は、VB.NETでDataTableからSelectでデータを抽出する方法についてご紹介します。
DataTable.Selectとは
DataTable.Selectメソッドは、条件を指定してDataTable内のデータを抽出する際に使用する機能です。
フィルター条件(SQLのWHERE句に似た形式)と並び順(オプション)を指定でき、該当する行をDataRowの配列として返します。
主な特徴は以下の通りです。
- フィルター条件:”Age > 30″ や “Name = ‘Tanaka'” など、文字列で指定する方式
- 並び順の指定:”Age DESC” のように列名と昇順・降順を文字列で指定可能
- 返り値:条件に合致するDataRow配列。該当する行がない場合は空の配列
基本的な使い方
Selectメソッドを使う流れは、まずDataTableにデータを準備し、続いてDataTable.Selectへ条件やソート順を文字列形式で渡すだけです。
返ってきたDataRow配列をループ処理すれば、抽出されたデータの内容を取り出すことができます。
具体的には以下のような手順です。
- DataTableに列を定義し、データを追加する
- Selectメソッドで条件式や並び順を指定する
- 戻り値のDataRow配列をループ処理し、必要な情報を取得する
次の章では、さまざまなパターンのコード例をご紹介します。
実用的な具体例
単一条件での抽出
以下の例では、”Age > 30″ という条件を使ってAgeが30より大きい行のみを抽出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' DataTableの作成とサンプルデータの追加 Dim dt As New DataTable() dt.Columns.Add("ID", GetType(Integer)) dt.Columns.Add("Name", GetType(String)) dt.Columns.Add("Age", GetType(Integer)) dt.Rows.Add(1, "Tanaka", 25) dt.Rows.Add(2, "Suzuki", 32) dt.Rows.Add(3, "Sato", 28) ' Ageが30より大きい行を抽出 Dim filteredRows() As DataRow = dt.Select("Age > 30") ' 結果の表示 For Each row As DataRow In filteredRows Console.WriteLine("ID: " & row("ID") & ", Name: " & row("Name") & ", Age: " & row("Age")) Next |
上記を実行すると、”Suzuki”のみが条件に該当し、以下のような出力が得られます。
ID: 2, Name: Suzuki, Age: 32
複数条件での抽出
複数条件の組み合わせにはANDやORなどを利用できます。
1 2 3 4 5 6 7 |
' Ageが25以上かつNameが'Tanaka'の行を抽出 Dim criteria As String = "Age >= 25 AND Name = 'Tanaka'" Dim result() As DataRow = dt.Select(criteria) For Each row As DataRow In result Console.WriteLine("ID: " & row("ID") & ", Name: " & row("Name") & ", Age: " & row("Age")) Next |
条件に合致しない行は抽出されないため、意図したデータのみを取り出すことが可能です。
並び替えを伴う抽出
Selectメソッドは第2引数にソート順を指定できます。
1 2 3 4 5 6 |
' Ageが20以上の行をAgeの降順で抽出 Dim rowsSorted() As DataRow = dt.Select("Age >= 20", "Age DESC") For Each row As DataRow In rowsSorted Console.WriteLine("ID: " & row("ID") & ", Name: " & row("Name") & ", Age: " & row("Age")) Next |
このように条件と並び替えを同時に行い、取得結果を扱いやすく整理することができます。
LIKE演算子を用いたパターンマッチ
文字列の部分一致検索にはLIKE演算子を使います。ワイルドカードとして「%」や「_」を用いて、柔軟に抽出が可能です。
1 2 3 4 5 6 |
' 名前に「a」が含まれる行を抽出(大文字・小文字は区別される点に注意) Dim patternRows() As DataRow = dt.Select("Name LIKE '%a%'") For Each row As DataRow In patternRows Console.WriteLine("ID: " & row("ID") & ", Name: " & row("Name")) Next |
上記の場合、「Name」に「a」が含まれる行のみが抽出されます。
NULL値を扱う抽出
列にNULLが含まれる場合、IS NULLやIS NOT NULLでフィルタリングができます。
1 2 3 4 5 6 7 8 9 10 |
' 新たに"Email"列を追加(初期値はNULL) dt.Columns.Add("Email", GetType(String)) dt.Rows(0)("Email") = "tanaka@example.com" ' 1行目にのみEmailを設定 ' EmailがNULLの行を抽出 Dim nullRows() As DataRow = dt.Select("Email IS NULL") For Each row As DataRow In nullRows Console.WriteLine("ID: " & row("ID") & ", Name: " & row("Name") & ", Email: NULL") Next |
このように、列がNULLである行、またはNULLではない行を簡単に取り出せます。
注意点
DataTable.Selectメソッドを使う際、いくつか押さえておきたいポイントがあります。
- 文字列のエスケープ:条件式に文字列を含む場合はシングルクオートで囲む必要があります。
- 大文字・小文字の区別:フィルター条件では基本的に大文字・小文字を区別する仕様です。
- パフォーマンス:データ量が増大するとSelectメソッドの処理時間が長くなる場合があります。
- フィルター構文:SQLと完全に同じではないため、公式ドキュメントで使用できる演算子や関数を確認すると安心です。
- 結果の扱い:返り値はDataRowの配列であるため、別途DataTableに取り込みたい場合はImportRowなどを利用します。
まとめ
DataTable.Selectを使えば、条件式や並び順を柔軟に指定して必要なデータを抽出できます。
SQLライクな表現が可能で、コードもシンプルに記述しやすい点が特徴です。
活用シーンに応じて条件を工夫し、効率の良いデータ抽出を行ってみてください。