web-dev-qa-db-ja.com

SQLクエリと(Java)コードでの値の選択

テーブルのnull許容列の列の値を使用して、整数の3つの値のいずれかを選択する必要があります。

少なくとも2つの方法があります。1)SQLを使用してすべての作業を行います。null値をテストし、他の値から選択するか、2)値を読み取ってコード(この場合はJava)を使用して選択します。

どちらが「良い」、すなわち。理解しやすく、保守しやすいですか?決定するために使用する他のメトリックはありますか?

例として、次のコードがあります。

// If id is equal to:
//   -1, then make v = 1
//   null, then make v = 2
//   in any other case, make v = 3

// Option 1:
int v;
String query = "SELECT CASE min(Id) WHEN NULL THEN 2 WHEN -1 THEN 1 ELSE 3 END AS Id"
        + "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)";
ResultSet rs = // execute query
if (rs.next()) {
    v = rs.getInt("Id");
} else {
    // TODO something went *very* wrong...
}

// Option 2:
int v;
String query = "SELECT CASE min(Id) Id"
        + "FROM TableA WHERE SomeField IN (SELECT ...blah blah...)";
ResultSet rs = // execute query
if (rs.next()) {
    final int id = rs.getInt("Id");
    if (rs.wasNull()) {
        v = 2;
    } else if (id == -1) {
        v = 1;
    } else {
        v = 3;
    }
} else {
    // TODO something went *very* wrong...
}
4
ArturoTena

あなたが与える例では、それが違いを生むとは思いません。

重要なことの1つは、ロジックを配置する場所と一貫していることです。そのため、後でどこを探すかがわかります。データベースをクエリするときは、必要なデータのみをプルするのが最善です。あなたの例では、違いはないようです(同じ数のレコードとデータ量)。

ロジックがさらに複雑になったときに何をしますか? Javaまたは選択した他の手続き言語で処理するほうがよい場合があります。これはおそらく個人的な好みですが、より熟練した言語の影響を受ける可能性があります。

このロジックを再利用するためのある種のコードライブラリが必要な場合は、データベースコードに含めることはお勧めしません。すべてのデータが同じデータベースから取得されるわけではありません。このロジックを別のテーブルまたは別の列で実行する場合はどうでしょうか。このコードを再利用することはできません。

これらの推奨事項は、事前に最適化しようとしたり、不要なものを拡張するために邪魔をしたりすることに基づいたものではありません。おそらく、両方のソリューションを同じ労力で構築できたでしょう。これらの潜在的な落とし穴が発生する可能性があると思われる場合は、その方向に進んで一貫してください。それがあなたであっても、次のコーダーはそれを感謝します。

編集:また、私は仕事で多くのSQLコードを(データベースオブジェクトとして)記述しますが、他の言語の文字列で記述する必要がある場合は、それに耐えられません。単純な選択で結構です。短いほど良い。

IDE-Java=のデバッガはここでおそらくもっと便利でしょう。もちろん、SQLをどこかでテストすることができます。

マジックナンバー-Javaコードでは、数値(1,2,3)を記述変数/定数として表す方が簡単です。

2
JeffO

あなたの質問への答えは別の質問です。これらの結果を任意の整数1、2、3としてエンコードするのはなぜですか?一部の外部Java API、または変更できない内部API用ですか?変更する場合は、一部のJavaラッパーで変換を行ってください。これにより、複数のクエリでこの変換が繰り返されるのを防ぐことができます。

==補遺==

OPによると、これらはイベントタイプを表すマジックナンバーです。その場合、私は先に進み、クエリで翻訳を行います。その翻訳を繰り返す必要がある別のクエリを作成した場合、翻訳をビューに因数分解します。しかし、結果の列を「ID」とは呼ばないので、何もわかりません。 「event_type」と呼んでいます。

1
kevin cline

簡単に言えば:

次の理由により、最初のオプションの方が優れています。

  1. クエリの記述に使用されるSQLの部分は、手続き型ではなく宣言型であるため、本質的にJavaよりも複雑ではないため、最初のオプションの方が循環的複雑度は低くなります。
  2. SQLを理解することは非常に一般的なスキルであるため、SQLコードのメンテナンスは安価です。プログラマーはJavaを知らないかもしれませんが、SQLを知っている可能性が非常に高くなります。

同様の質問に対する私の答え( here )はそれについて詳しく述べています。

これ 他の同様の質問に対する他の回答もこれをサポートしています。

1