ORDERBY "human" 使用 SQL 字符串操作的字母顺序

Posted

技术标签:

【中文标题】ORDERBY "human" 使用 SQL 字符串操作的字母顺序【英文标题】:ORDERBY "human" alphabetical order using SQL string manipulation 【发布时间】:2012-08-31 18:47:55 【问题描述】:

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

数值:图1.9、图1.10、图1.11...

字母顺序:图 1A ... 图 1Z ... 图 1AA

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

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

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

    删除句号(可以用replace完成,对吧?)

    如果剩余的数字超过三个字符,在第一个字符后添加0(零)。

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

请注意,我不想修改数据本身——只是为了按所述顺序输出查询结果。

这是在 Wordpress 安装的上下文中,但我认为这个问题更适合 SQL 问题,因为各种事情(例如分页)取决于 mysql 查询阶段发生的排序,而不是 php

【问题讨论】:

遗憾的是,我认为最好的办法是设置一个查找表,以便 1 => 1.110 = 1.10 您实际使用的值是什么:“1.1”、“图 1.1”或“图 1.1 这是该图的标题”? 我那是个坏主意,不是吗?在一个选择中是否会混合使用数字和字母来排序?如果是这样,我们可以假设 1Z 之后是 2.0 吗? @GordonLinoff 实际上是identifier | Figure 1.1 | This is the caption for the figure。 | 的两个实例总是在Figure 1.1 的两侧,所以我假设这使得Figure 1.1 子字符串相对容易获得。 下面有一个很好的答案,神秘地消失了……有人知道为什么吗? 【参考方案1】:

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

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

无论如何...这将是一个痛苦。我不喜欢你。

【讨论】:

【参考方案2】:

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

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 等

你可以使用这个函数作为 order by

 SELECT * FROM <Table_Name> ORDER BY GetHumanSortOrder(<Column_Name>) 

希望对你有帮助

【讨论】:

以上是关于ORDERBY "human" 使用 SQL 字符串操作的字母顺序的主要内容,如果未能解决你的问题,请参考以下文章

django 中的“TemplateSyntaxError at / 'humanize' 不是注册的标签库”

在对象 (ROOT_QUERY) 上找不到字段 allProjects("first":5,"skip":0,"orderBy":"

Spark orderBy(desc("col"))部分数据排序失败

这是啥意思:“成员引用类型'Human *'是一个指针;你的意思是使用'->'吗?” [复制]

String数组的定义和赋值

是否可以通过 OrderBy 方法使用数组?