0

レコード/データ/文字列の長さが8文字を超えるテーブルフィールドからレコードを取得する必要があります。クエリを使用する必要があるため、文字列関数を使用できません(MySQL、MSSQL、Oracle)。

以下の例はやりたくない:

List<String> names = new ArrayList<String>();
String st = select 'name' from table;

rs = executeSQL(st);
if ( rs != null )
{
    rs.next();
    names.add(rs.getString(1));
}

for(String name : names)
{
    if(name.length() > 8)
    result.add(name);
}

上でコーディングしたもの以外のアイデアはありますか?取得したデータを処理してから必要な結果を取得する代わりに、必要な結果を取得できるクエリ。

助け/手がかりをありがとう。

4

3 に答える 3

1

JDBCドライバーは、JDBC仕様の付録D(スカラー関数)にリストされている関数のJDBCエスケープを実装する場合があります。ドライバーは、サポートするスカラー関数をデータベース側の適切な関数に変換する必要があります。サポートされている関数のリストは、「DatabaseMetaData.getStringFunctions()」を使用して照会できます。

これをクエリで使用するには、次を使用するCHAR_LENGTH(string)LENGTH(string)、次のようにします。

SELECT * FROM table WHERE {fn CHAR_LENGTH(field)} > 8

に置き換えることができCHAR_LENGTHますLENGTH。ドライバー(この関数をサポートしている場合)は、基になるデータベース内の適切な関数に変換します。

セクション13.4.1からJDBC4.1仕様のスカラー関数:

付録D「スカラー関数」は、ドライバーがサポートすることが期待されるスカラー関数のリストを提供します。ただし、データソースがこれらの関数をサポートする場合にのみ、ドライバーはこれらの関数を実装する必要があります。

スカラー関数のエスケープ構文は、付録D「スカラー関数」で定義されているスカラー関数を呼び出すためにのみ使用する必要があります。エスケープ構文は、ユーザー定義またはベンダー固有のスカラー関数を呼び出すために使用することを意図したものではありません。

于 2012-08-06T09:49:07.677 に答える
1

データベースの機能を活用して、SQLステートメント(またはSQL機能をカプセル化するオブジェクト)用のファクトリを実装する方がよいと思います。

このようにして、データベースの名前/タイプを使用してファクトリを構成でき、そのデータベースに適切なSQLステートメントが提供されます。これにより、この情報をパラメーター化するためのクリーンな手段が提供されると同時に、データベースの機能を活用でき、コード内でデータベースの機能を次善の方法で複製する必要がなくなります。

例えば

   DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE);
   String statement = fac.getLongNames();
   // then use this statement. It'll be configured for each db type

さらにカプセル化して、次のようなものを使用することをお勧めします。

   DabaseStatementFactory fac = DatabaseStatementFactory.for(NAME_OF_DATABASE);
   List<String> names = fac.getLongNames();

あなたが再仮定をしていないように。共通のスキーマとクエリの手段など。

于 2012-08-06T09:40:15.080 に答える
1

私が見つけた別の解決策は次のとおりです。

Select name from table where name like '________';

SQLはアンダースコア(_)文字をカウントし、アンダースコア文字の数に等しい長さの名前を返します。

于 2012-08-08T11:03:55.450 に答える