自定义 SQL 排序依据

Posted

技术标签:

【中文标题】自定义 SQL 排序依据【英文标题】:Custom SQL sort by 【发布时间】:2011-03-08 05:28:39 【问题描述】:

使用: 用户搜索部分邮政编码,例如“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 等)。我不确定指定降序是否会删除排序

【问题讨论】:

什么数据库系统 - 什么版本?? 【参考方案1】:
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

【讨论】:

这段代码看起来像是为 Postgres 设计的。另见***.com/questions/1309624/…【参考方案2】:

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

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

这里你不需要 DESC。

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

【讨论】:

非常感谢您!我不是一个经常从墙上反弹但不必在我的 php 页面中重组我的代码的人,这绝对是上帝派来的!我不应该有任何不在列表中的邮政编码,因为我的匹配项应该将它们淘汰,并且它使用相同的邮政编码数组来检查按字段的顺序并匹配它们!再次感谢您,很抱歉我无法为您的代表 +1,因为您至少需要 15 个代表 供将来参考,FIELD( ) 似乎是 mysql 的一项功能【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

如果您要对多种邮政编码进行排名,那么案例陈述就会变得非常重要。

【讨论】:

以上是关于自定义 SQL 排序依据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 prestashop 中添加自定义产品“排序依据”字段?

如何在 Elixir 或 SQLAlchemy 中为与其自身的多对一关系创建可自定义的“排序依据”?

power bi怎么排序?power bi自定义排序啊?求教程

mybatis plus wrapper.orderBy 自定义排序 自定义sql 多字段拼接

mybatis plus wrapper.orderBy 自定义排序 自定义sql 多字段拼接

mybatis plus wrapper.orderBy 自定义排序 自定义sql 多字段拼接