5

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

  • 数值:图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(零)。

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

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

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

4

2 回答 2

0

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

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

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

于 2012-09-08T14:24:31.027 回答
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 等

您可以使用此功能作为 order by

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

希望这可以帮助

于 2012-09-19T07:55:47.467 回答