4

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

我似乎找不到通过部分匹配进行排序的方法,例如:

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

因为不是专门找RG20 7TT,我觉得不能部分匹配。

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

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

4

4 回答 4

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
于 2011-03-08T06:44:00.350 回答
5

您走在正确的轨道上,将字段缩减为前四个字符:

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

在这里你不需要 DESC。

(如果您的结果集包含前缀出现在 FIELD() 排序列表中的邮政编码,您将需要做更多工作,因为否则这些记录将出现在您指定的任何明确排序的记录之前。在 'RG20' 之前上面的例子。)

于 2011-03-08T06:47:37.793 回答
2

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

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

于 2011-03-08T06:39:33.693 回答
1

Another method I use is utilising the charindex function:

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

I think that's the syntax anyway, I'm just doing this in SAS at the moment so I've had to adapt from memory!
But essentially the sooner you hit your desired part of the string, the higher the rank.

If you're trying to rank on a large variety of postcodes then a case statement gets pretty hefty.

于 2013-03-06T12:24:26.973 回答