9

これは頻繁に発生し、 XSLTRuby、およびDrupalのStackOverflowで発生することがわかりますが、SQLでは特に表示されません。

問題は、タイトルが「The」、「A」、または「An」で始まる場合、どのように正しくソートするかということです。

1つの方法は、これらの文字列をTRIM()することです。

ORDER BY TRIM( 
  LEADING 'a ' FROM 
  TRIM( 
    LEADING 'an ' FROM 
    TRIM( 
      LEADING 'the ' FROM LOWER( title ) 
      ) 
    ) 
  )

これはしばらく前にAskMeFiで提案されました(その機能が必要LOWER()ですか?)。

私はこれのある種のCase/Switch実装も見たことがあることを知っていますが、Googleにとっては少し難しいです。

明らかに、考えられる解決策はたくさんあります。良いのは、パフォーマンスに影響を与えるSQLの達人です。

4

6 に答える 6

7

私が見たアプローチの1つは、2つの列を用意することでした。1つは表示用、もう1つは並べ替え用です。

description  |  sort_desc
----------------------------
The the      | the, The
A test         | test, A
I, Robot      | i, Robot

私は実際のテストを行っていませんが、これにはインデックスを使用できるという利点があり、説明で並べ替えるたびに文字列を操作する必要がありません。データベースがマテリアライズドビューをサポートしていない限り(MySQLはサポートしていません)、計算列にインデックスを付けることができないため、ロジックを計算列としてビューに実装してもメリットはありません。

于 2010-07-15T05:08:57.607 に答える
4

私はこれを何年も使用してきましたが、どこで見つけたか思い出せません:

SELECT 
CASE
    WHEN SUBSTRING_INDEX(Title, ' ', 1) IN ('a', 'an', 'the') 
    THEN CONCAT( SUBSTRING( Title, INSTR(Title, ' ') + 1 ), ', ', SUBSTRING_INDEX(Title, ' ', 1) ) 
    ELSE Title 
    END AS TitleSort,
Title AS OriginalTitle 
FROM yourtable 
ORDER BY TitleSort 

収量:

TitleSort                  | OriginalTitle
------------------------------------------------------
All About Everything       | All About Everything
Beginning Of The End, The  | The Beginning Of The End
Interesting Story, An      | An Interesting Story
Very Long Story, A         | A Very Long Story
于 2015-06-24T19:15:51.567 に答える
0

私はSQLServerについてのみ話すことができます。CASEステートメント内でLTRIMを使用します。デフォルトでは大文字と小文字が区別されないため、LOWER関数は必要ありません。ただし、記事を無視したい場合は、ノイズワード辞書を使用して全文索引カタログを設定することをお勧めします。他の実装がSQLでこれをサポートしているかどうかはわかりません。

于 2010-07-15T05:10:29.397 に答える
-1

LOWER is needed. While SELECT is not case-sensitive, ORDER BY is.

于 2010-12-11T03:12:35.813 に答える
-3

次のことを試してください。

ORDER BY replace(replace(replace(YOURCOLUMN,'THE',''),'a\'',''),'an','')

未検証!

于 2013-06-14T09:23:56.397 に答える