如何使用Delphi按照SQL Server的方式对GUID进行排序

4
在我正在处理的项目中,如果我能够对内存中的guid列表进行排序并与按这些相同guid排序的SQL服务器表进行比较,那就太好了。不幸的是,当SQL Server返回一个有序列表时,顺序并不立即显现。
那么,最好的方法是如何对这个内存列表进行排序,以便顺序与SQL Server返回的顺序相同?
例如,查询“SELECT ID FROM TABLE1 ORDER BY ID”返回:
A46030EC-BF3A-4F7C-88CC-00117DBC1A52
159A0A9D-18B7-4D6C-ABB3-005FAB666D91
3C58CFC5-1829-481C-9686-007CE71132B8
15A96D5F-DAFB-4EF1-9202-00B201CE5151
BCFDE733-0AB0-483F-B912-00BF93F6FA7E
6CC06558-7670-4879-9D3F-00CB3D3649BD

假设我有一个字符串数组,其中包含上面的guid值,但按以下顺序排列:

159A0A9D-18B7-4D6C-ABB3-005FAB666D91
15A96D5F-DAFB-4EF1-9202-00B201CE5151
6CC06558-7670-4879-9D3F-00CB3D3649BD
8A9325AF-A84E-4BDB-AFA8-C9D09D7FC064
A46030EC-BF3A-4F7C-88CC-00117DBC1A52
BCFDE733-0AB0-483F-B912-00BF93F6FA7E

我想看到的是SQL查询中缺少一个,而SQL查询没有的一个。最快的方法显然是将两个列表以相同的方式排序,但我不想执行像“SELECT ID FROM TABLE1 ORDER BY cast(ID as varchar(100))”这样的查询,而是更愿意在Delphi端修复排序。


虽然可能有一种匹配的方法,但我认为我会重新考虑为什么我想要这个。这只是一个“cookie”,你不应该需要匹配这样的东西。找到另一种方式来完成它们。 - mj2008
因为ID是唯一可靠的表值,可以唯一标识每条记录。由于此例程经常被访问,因此速度至关重要。 - skamradt
1个回答

8

Alberto Ferrari写了一篇关于此的博客文章。以下是其中内容:

0 1 2 3  4 5  6 7  8 9  A B C D E F
00000000-0000-0000-0000-010000000000
  • 0..3 从左到右依次计算,是最不重要的;
  • 4..5 从左到右依次计算;
  • 6..7 从左到右依次计算;
  • 8..9 从右到左依次计算;
  • A..F 从右到左依次计算,是最重要的。

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