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
如果我orderby
title,结果是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.1
和 10 = 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"))部分数据排序失败