質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

5302閲覧

DataTableの昇順ソートする際、指定したキーの列が空行の行が先頭に来るのを避けたいです。

xss

総合スコア36

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2018/03/08 01:24

編集2018/03/08 02:14

前提・実現したいこと

DataTableを昇順ソートして、指定したキーの列が空行のレコードが先頭になるのを避けたいです。
指定したキーの列が空行のレコードは削除しても構いません。
昇順された値のあるレコードが欲しいです。
よろしければ手法やコードを教えて頂けませんでしょうか?

お手数をおかけしますがご教授をよろしくお願い致します。

●例:ageをキーにして昇順をします。

①:クエリを実行して取得した結果をDataTableに格納します。
※方は全てVARCHAR2(10byte)です。
※空白の列= 一文字の半角空白行が入っています。
|name|age|city|
0. |田中|20|神奈川県|

  1. |森田| |東京都|
  2. |山田|19|東京都|

②:①のDataTableを昇順でソートします。(現状こうなっています。)
|name|age|city|
0. |森田| |東京都|

  1. |山田|19|東京都|
  2. |田中|20|神奈川県|

③ 先頭に|山田|19|東京都|のレコードが来るようにしたいです。

該当のソースコード

'SQLで取得した結果をDataTableに格納する為の変数 Dim sqlResult As New DataTable sqlResult = クエリの実行する関数。Select文の結果を返してsqlResultに格納されます。 'ソートした結果を格納する為の変数 Dim sortResult As New DataTable ' データテーブルのコピーを作成 sortResult = sqlResult.Clone() ' ソートされたデータビューの作成 Dim dv As DataView = New DataView(sqlResult) dv.Sort = "age" ' ソートされたレコードのコピー For Each drv As DataRowView In dv sortResult.ImportRow(drv.Row) Next

補足情報(FW/ツールのバージョンなど)

VisualStudio2017
VB.NET

Option Explicit On
Option Strict On

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

DataViewでのソートはNULL先頭になりますね。
そのままでNULLを後ろに持ってくることは出来ないので、
DataViewでそのままやるとしたら、
ソートするための列を作るのが楽だと思います。
ageでのソートであれば空白の代わりに999を入れておいて
後ろに来るようにするとかです。

sqlResult.Columns.Add("age_sort", GetType(Integer), "ISNULL(age, 999)")

ageの型は良く分かりませんが、こんな感じでNULLだったら999を入れる式で作った
新しい列を追加して、dv.Sortをage_sortにするとか。

[追記]
型がVarChar2で空白が入っているという事なので、ISNULLではなくIIFで比較が良いと思います。

sqlResult.Columns.Add("age_sort", GetType(String), "IIF(age = ' ', '999', age)")

こんな感じでageが空白だったら999を入れてそれ以外はそのままの列を追加できます。
動作は未確認なので試してみてください。

投稿2018/03/08 01:45

編集2018/03/08 02:32
sh_akira

総合スコア380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2018/03/08 02:06

sh_akiraさん回答ありがとうございます。すごく参考になります。今回はVARCHAR2です。型を記述し忘れていました・・。自分の知識が浅くお粗末な質問で申し訳ありません。 前回のコメント誤爆してしまいましたすみません。
xss

2018/03/08 02:18

sh_akiraさん、折角ご回答を頂いたのに説明する文章が間違えていました。 レコードの空白の列= 一文字の半角空白行が入っています。 Nullではありませんでした。申し訳ございません。
sh_akira

2018/03/08 02:32

追記しました。ISNULLの代わりにIIFでどうでしょうという内容です。
xss

2018/03/08 02:44

sh_akiraさん追記ありがとうございます。確認した結果、私の思った結果に至ることが出来ました。本当に感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問