12

C# を使用して、SQLite データベースから呼び出している映画タイトルのリストを表示しています。現在、すべての項目の先頭から「The」という単語を削除してテキストを並べ替える機能を持つカスタム ListBox クラスを使用しています。ただし、SQLite データベースから呼び出してからソートするため、最も簡単な方法とは言えません。できれば「SELECT」クエリでデータベースから直接並べ替えて、1 つのステップに減らしたいと思います。

これについていくつか検索を行ったところ、データベースに追加の並べ替え列を作成するなど、いくつかの提案が見つかりました。これは確かに可能性ですが、ほぼ同一の重複情報を挿入する必要のない、より簡単なオプションがあるかどうか疑問に思っています (特にデータベースが大きくなった場合)。私は SQLite にはかなり慣れていませんが、カスタム順序付けの作成に使用できる照合関数の作成について読んだことがあります。ただし、これが適切な使用法であるかどうかはわかりません.C#で実装する際の助けはないようです。

誰かが何らかのガイダンスを共有できることを望んでいました。追加の並べ替え列が最適な方法である場合は、それを実行します。

4

6 に答える 6

6

解決策は次のとおりです。

ORDER BY (CASE 
    WHEN sortTitle LIKE 'the %' THEN substr(sortTitle,5) 
    WHEN sortTitle LIKE 'a %' THEN substr(sortTitle,3) 
    WHEN sortTitle LIKE 'an %' THEN substr(sortTitle,4) 
    ELSE sortTitle END)
于 2013-03-02T01:51:33.343 に答える
6

重複データの挿入を避けるために、2 つの列を持つことはどうでしょうか。TITLE_PREFIX (通常は空ですが、"The " または "A " を含む場合があります。この列にはインデックスはありません) と TITLE ("The " または "A " を含まないタイトルを含みます。これは、インデックスを作成する列です)。データを表示するには、TITLE_PREFIX と TITLE を組み合わせる必要があります。ただし、TITLE で検索するだけです。

于 2010-09-12T18:38:14.617 に答える
1

title各タイトルをとの 2 つの部分に保存できますprefix

|| operatorSQLite を使用すると、 とも呼ばれる を介して 2 つの文字列値を組み合わせることができますconcatenate operator

次に例を示します。

SELECT prefix || ' ' || title FROM movies ORDER BY title

プレフィックスが空の場合にも使用できるltrimため、前にスペースがありません。

SELECT ltrim(prefix || ' ' || title) FROM movies ORDER BY title

もう 1 つの方法は、タイトルの末尾にプレフィックスを格納することです。たとえば、多くの映画館では次のようなものを見かけます。

三銃士、

于 2010-09-12T18:38:39.347 に答える
0

タイトルで( FTSモジュールを使用して)全文検索をサポートするテーブルを作成してみることができます。そうすれば、多くの余分な作業を必要とせずに、タイトル内の任意の単語をすばやく検索できるようになります。たとえば、のユーザークエリはgood bad ugly、最初の結果の1つとして「良い、悪い、醜い」を生成する場合があります。これらすべての追加コストは、一般にテキスト自体の長さの約4分の1ですが、タイトルが完全な英語のテキストではないため、データセットの場合はそれ以上になる可能性があります。また、これらの追加のインデックスの作成に時間を費やす必要があります。ライブシステムのメインデータセットに作成する必要はありませんが(明らかに)、それほど大きな問題にはなりません。

于 2010-09-12T21:35:07.497 に答える
0

仮想列 (C# で実装できる関数の結果) を作成し、この仮想列で並べ替えます。この関数は、「三銃士、ザ」のように「ザ」を最後に移動することも、「ザ」を破棄することもできます。

于 2010-09-14T18:02:10.803 に答える
0

C# コード内

C# 内でこれを行う場合は、LINQ を使用して順序付けを行います。完全なサンプルを PasteBin に投稿しました。これにより、次のことが可能になります。

  • データベース内のデータの重複を避ける
  • どの RDBMS であっても、通常どおり DB インデックスを利用する
  • 構成ファイルにノイズ ワードを入れることで、リストを変更する際のダウンタイム/再構築/再デプロイを削減します。
  • クライアントコードでソリューションをより読みやすくする
DropDownList1.DataSource = myBooks.OrderBy(n => ReplaceNoise(n.Title))

public string ReplaceNoise(string input)
{
     string[] noise = new string[] { "the", "an", "a" };

     //surely this could be LINQ'd 
     foreach (string n in noise)
     {
         if (input.ToLower().StartsWith(n))
         {
             return input.Substring(n.Length).Trim();
         }
     }
     return input;
}

SQLite ステートメント内

単純にノイズ ワードを order by の空白に置き換えてみてはどうでしょうか。これは見苦しい最初のステップですが、並べ替えのためにこの値を格納する新しい列を強く検討してください。

ORDER BY REPLACE(REPLACE([title],'the',''), 'a', '')

確かに、これは最終的に次のようになると見苦しくなります。

REPLACE(REPLACE(REPLACE(REPLACE([title],'The ',''),'a',''),'of',''),'by','')
于 2010-09-12T18:43:00.880 に答える