我有一个帖子表,其标题是“人”字母顺序但不是按计算机字母顺序排列。它们有两种形式,数字和字母:
数字:图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的专家,所以我不知道这是否可行,但是如果有办法进行条件替换,那么看起来我可以通过这样做来强加我想要的顺序:
删除期间(可以使用replace
完成,对吧?)
如果剩余的图号超过三个字符,请在第一个字符后添加0
(零)。
这似乎给了我想要的结果:1.9
将变为109
,它出现在110
之前; 1Z
将成为10Z
,1AA
之前。但它可以在SQL中完成吗?如果是这样,语法是什么?
请注意,我不想修改数据本身 - 只是按照描述的顺序输出查询结果。
这是在Wordpress安装的上下文中,但我认为问题更适合SQL问题,因为各种事物(例如分页)依赖于MySQL查询阶段发生的排序,而不是PHP。
答案 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>)
希望这有帮助