使用SQL字符串操作的ORDERBY“人类”字母顺序

时间:2012-09-06 21:32:56

标签: mysql sql wordpress

我有一个帖子表,其标题是“人”字母顺序但不是按计算机字母顺序排列。它们有两种形式,数字和字母:

  • 数字:图1.9,图1.10,图1.11 ......

  • 按字母顺序排列:图1A ...图1Z ...图1AA

如果我orderby标题,结果是1.10-1.19介于1.1和1.2之间,1AA-1AZ介于1A和1B之间。但这不是我想要的;我想要“人类”字母顺序,其中1.10在1.9之后,1AA在1Z之后。

我想知道在SQL中是否还有一种方法可以使用字符串操作(或者其他我没想过的东西)来获取我想要的顺序。

我不是SQL的专家,所以我不知道这是否可行,但是如果有办法进行条件替换,那么看起来我可以通过这样做来强加我想要的顺序:

  1. 删除期间(可以使用replace完成,对吧?)

  2. 如果剩余的图号超过三个字符,请在第一个字符后添加0(零)。

  3. 这似乎给了我想要的结果:1.9将变为109,它出现在110之前; 1Z将成为10Z1AA之前。但它可以在SQL中完成吗?如果是这样,语法是什么?

    请注意,我不想修改数据本身 - 只是按照描述的顺序输出查询结果。

    这是在Wordpress安装的上下文中,但我认为问题更适合SQL问题,因为各种事物(例如分页)依赖于MySQL查询阶段发生的排序,而不是PHP。

2 个答案:

答案 0 :(得分:0)

我的第一个想法是添加一个由触发器或其他外部机制更新的附加列。

1)使用该列进行排序 2)无论什么机制更新,列都将具有通过代理创建可接受订单的逻辑(例如,它会将1.1变为AAA或类似的东西)。

无论如何......这将是一种痛苦。我不会贬低你。

答案 1 :(得分:0)

您可以创建具有逻辑以具有人类排序顺序的函数,如

Alter FUNCTION [dbo].[GetHumanSortOrder] (@ColumnName VARCHAR(50))
RETURNS VARCHAR(20)
AS

BEGIN
DECLARE @HumanSortOrder VARCHAR(20)

SELECT  @HumanSortOrder =
CASE 
    WHEN (LEN(replace(replace(<Column_Name>,'.',''),'Figure ',''))) = 2
THEN
CONCAT (SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),1,1),'0',SUBSTRING(replace(replace(<Column_Name>,'.',''),'Figure ',''),2,2))
    ELSE
       replace(replace(<Column_Name>,'.',''),'Figure ','')
      END 
FROM    <Table_Name> AS a (NOLOCK)
WHERE   <Column_Name> = @ColumnName

RETURN  @HumanSortOrder

END

这个功能可以根据需要给你104,107,119,10A,10B等

您可以按照

的顺序使用此功能
 SELECT * FROM <Table_Name> ORDER BY GetHumanSortOrder(<Column_Name>) 

希望这有帮助