自定义SQL排序依据

时间:2011-03-08 05:28:40

标签: sql postgresql sql-order-by postal-code

使用: 用户搜索部分邮政编码,例如“RG20”,然后应以特定顺序显示。该查询在布尔模式下使用MATCH AGAINST方法,其中数据库中的邮政编码示例为“RG20 7TT”,因此它能够找到它。 同时,它还匹配其半径内的其他邮政编码列表(这是一个单独的查询)。

我似乎无法通过部分匹配找到订购方式,例如:

ORDER BY FIELD(postcode, 'RG20', 'RG14', 'RG18','RG17','RG28','OX12','OX11') 
      DESC, city DESC

因为它不是专门寻找RG20 7TT,所以我认为它不能进行部分匹配。

我尝试了SUBSTR(邮政编码,-4)并向左和向右看,但我没有使用'by field'取得任何成功,也找不到另一条路线...... 对不起,这是一个有点长的啰嗦,但我有点绑定。 英国邮政编码分为两部分,最后一部分总是3个字符,在我的数据库中,两者之间有一个空格,如果这有帮助的话。

虽然在邮政编码之后有一个DESC,我确实需要它们以特定顺序显示(RG20,RG14然后是RG18等)。我不确定指定降序是否会删除订购

4 个答案:

答案 0 :(得分:11)

Order By Case
            When postcode Like 'RG20%' Then 1
            When postcode Like 'RG14%' Then 2
            When postcode Like 'RG18%' Then 3
            When postcode Like 'RG17%' Then 4
            When postcode Like 'RG28%' Then 5
            When postcode Like 'OX12%' Then 6
            When postcode Like 'OX11%' Then 7
            Else 99
            End Asc
    , City Desc

答案 1 :(得分:5)

你在正确的轨道上,将字段缩小到前四个字符:

ORDER BY FIELD(LEFT(postcode, 4), 'RG20', 'RG14', ...),
--          or SUBSTRING(postcode FROM 1 FOR 4)
--          or SUBSTR(postcode, 1, 4)

这里你不想要DESC。

(如果您的结果集包含其前缀 not 的帖子代码出现在您的FIELD()排序列表中,那么您还需要做更多的工作,因为这些记录会在任何显式之前出现。您指定的有序记录。在上例中的'RG20'之前。)

答案 2 :(得分:2)

如果你想要一个完全自定义的排序方案,那么我只看到一种方法来做... 创建一个表来保存要排序的值,并包含“sequence”或“sort_order”字段。然后,您可以加入此表并按序列字段排序。

关于序列字段的一个注释。将它创建为int是有意义的......好吧,序列通常是int :) 如果有任何更改排序顺序的可能性,您可能需要考虑将其设为字母数字...在“5和”6“之间插入”5A“要比它更容易将数字插入整数序列。

答案 3 :(得分:1)

我使用的另一种方法是使用charindex function

order by charindex(substr(postcode,4,1),"RG20RG14RG18...",1)

我认为这是语法无论如何,我现在只是在SAS中这样做,所以我不得不从记忆中适应! 但基本上你越早点击你想要的部分字符串,就越高。

如果你想对各种各样的邮政编码进行排名,那么一个案例陈述会非常沉重。