3

私は、FMDB を使用して、英数字 (アルファベットが最初、数字が 2 番目) で並べ替える必要があるタイトルの書籍のリストを保存する iOS アプリに取り組んでいます。ただし、アスタリスクや括弧などの英数字以外の先頭文字も無視する必要があります。「The」も無視する必要があります。さらに、この並べ替えられたデータはインデックス付きの UITableView に表示されるため、各セクションに入る主要な文字と本のタイトルの数のリストを取得できる必要があります。

例-

これは本のタイトルのリストです:

"A Title 1", "A Title 2", "The A Title 3", "B Title 1", "B Title 2", "B Title 3", 
"*B Title 4", "C Title 1", "(The) C Title 2", "3 Title 1"

このリストから、タイトルを入れるために 4 つのセクションを数えます (「A」、「B」、「C」、「3」)。また、各セクションに入る本の数も数えます (「A」-3 本、「B」-4 本、「C」-2 本、「3」-1 本)。このチュートリアルを使用して、セクションとインデックス作成を設定できましたが、「The A Title 3」、「*B Title 4」、および「(The) C Title 2」などのタイトルの処理に問題があります。

現在、これは私が使用しているステートメントです:

SELECT DISTINCT UPPER(SUBSTR(BookTitle, 1, 1)) AS Section, 
COUNT(BookTitle) AS SectionCount 
FROM BookTable 
GROUP BY Section ORDER BY IFNULL(Section + 1, 0), Section

これは、英数字順にソートされたセクションのリストと、各セクションに入る本の数を返します。問題は、私の 'T' セクションに含まれる本が多すぎるということです。言うまでもなく、これらを無視したいときに < または * などの特殊文字のセクションを取得しています。英数字以外の文字と「 The 」の出現を削除する必要があると考えていますが、現在のようにクエリに統合する方法がわかりません。

これが十分に詳細であることを願っています。どんなことでもお気軽にご相談ください。いつもありがとうございます。

4

2 に答える 2

1

SQLでの文字列操作は、他の言語と比較した場合、通常「基本に戻る」ものです。これがあなたが取るかもしれない1つのアプローチです:

select upper(substring(titleclean, 1, 1)) as Section, count(*)
from (select bt.*,
             (case when upper(substring(titletrim, 1, 4)) = 'THE ' or
                        upper(sutring(titletim, 1, 5)) = 'THE) '
                   then substring(titletrim, 5, 1000)
                   else titletrim
              end) as titleclean
      from (select bt.*, ltrim(title, '()*') as titletrim
            from booktable bt
           ) bt
     ) bt
group by upper(substring(titleclean, 1, 1))
order by (case when substring(titleclean, 1, 1) between '0' and '9' then 1
               else 0
          end),
         Section

これは、サブクエリで変数を割り当てることによって文字列操作を実行しています。これらはあなたが望むルールに従っていると思います。最も内側のltrim()は、不要な初期変数を削除しています。

式「ifnull(section + 1,0)」をより明確な範囲比較に変更しました。お使いのバージョンはSQLiteで動作する可能性があります。ほとんどのデータベースでは、数値以外のセクションでエラーが発生します。

于 2012-07-15T19:44:46.917 に答える
1

最適なオプションは、挿入時にこれらの条件を確認し、タイトルの最後に「The」を追加することです (例: 「A Title 3, The」)。現在のデータベースを更新し、「The」を最後までモートする簡単なプログラムを作成できます。

しかし、本当にこの方法を維持したい場合は、ケース式を調べてください。関連トピックは次のとおりです

基本的に、「The」または特殊文字の大文字と小文字を確認し、その大文字と小文字を SUBSTR で使用します。

于 2012-07-15T19:05:09.420 に答える