自定义SQL排序依据

Dev*_*arb 4 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

Tho*_*mas 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
Run Code Online (Sandbox Code Playgroud)


pil*_*row 5

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

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

在这里你不需要DESC.

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