如何在SQL中排序,忽略文章('the","a","an"等)

Amb*_*pel 8 mysql sql sorting trim switch-statement

这出现了很多,我可以看到它出现在XSLT,RubyDrupal的 StackOverflow上,但我没有看到它专门用于SQL.

所以问题是,当你以"The","A"或"An"开头时,如何正确地对标题进行排序?

一种方法是简单地TRIM()那些字符串:

ORDER BY TRIM( 
  LEADING 'a ' FROM 
  TRIM( 
    LEADING 'an ' FROM 
    TRIM( 
      LEADING 'the ' FROM LOWER( title ) 
      ) 
    ) 
  )
Run Code Online (Sandbox Code Playgroud)

这是AskMeFi上一段时间的建议(它是否需要该LOWER()功能?).

我知道我也看过某种Case/Switch实现,但这对谷歌来说有点困难.

显然,有许多可能的解决方案.什么是好的是SQL大师权衡其中有性能影响.

OMG*_*ies 6

我见过的一种方法是有两列 - 一列用于显示,另一列用于排序:

description  |  sort_desc
----------------------------
The the      | the, The
A test         | test, A
I, Robot      | i, Robot
Run Code Online (Sandbox Code Playgroud)

我没有进行任何真实世界的测试,但这样做的好处是能够使用索引,并且每次要按描述排序时都不需要字符串操作.除非您的数据库支持物化视图(MySQL不支持),否则在视图中将逻辑实现为计算列将不会提供任何好处,因为您无法索引计算列.


GDP*_*GDP 5

我已经使用这个多年了,但不记得在哪里找到它:

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 
Run Code Online (Sandbox Code Playgroud)

产量:

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
Run Code Online (Sandbox Code Playgroud)