按字母顺序使用SQL字符串操作对“human”进行排序ORDERBY。

5
我有一个帖子表格,其中标题按照“人类”字母顺序排列,但不是按照计算机字母顺序排列。这些标题有两种类型,数字和字母:
- 数字:Figure 1.9, Figure 1.10, Figure 1.11... - 字母:Figure 1A ... Figure 1Z ... Figure 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 (零)。
这似乎会给我想要的结果: 1.9 将变为 109 ,出现在 110 之前; 1Z 将变为 10Z ,出现在 1AA 之前。但是它可以在SQL中完成吗?如果可以,语法是什么?
请注意,我不想修改数据本身,只想以所述顺序输出查询结果。
这是在WordPress安装的上下文中,但我认为问题更适合是一个SQL问题,因为各种事情(如分页)取决于MySQL查询阶段发生的排序,而不是在PHP中进行排序。

很遗憾,我认为您最好的选择是设置一个查找表,使1 => 1.110 = 1.10 - Kermit
你实际使用的值是什么:"1.1", "图1.1",还是"图1.1这是图的说明"? - Gordon Linoff
1
我的天,那真是个糟糕的主意,不是吗?在一个选择中会混合数字和字母进行排序吗?如果是这样,我们可以假设1Z后面跟着2.0吗? - Tony Hopkinson
@GordonLinoff 实际上是 {identifier} | 图1.1 | 这是图的标题。两个 | 符号总是出现在 Figure 1.1 的两侧,因此我认为获取子字符串 Figure 1.1 相对容易。 - supertrue
下面有一个很好的答案,但它神秘地消失了... 有人知道为什么吗? - supertrue
2个回答

0

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

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

无论如何...这将是一件痛苦的事情。我不羡慕你。


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>) 

希望这能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接