使用的程序:
SQL Server 2000, Excel 2003
我们的数据库中有一个名为 Samples 的表。使用以下查询...
SELECT [Sample], [Flag] FROM Samples
ORDER BY [Sample]
...我们得到以下结果:
Sample Flag
---------- ----
12-ABC-345 1
123-45-AB 0
679-ADC-12 1
当用户在 Excel 电子表格中具有相同的数据并按示例列排序时,他们会得到以下排序顺序:
Sample Flag
---------- ----
123-45-AB 0
12-ABC-345 1
679-ADC-12 1
出于好奇,为什么 SQL 和 Excel 中的排序之间存在差异(除了“因为它是 Microsoft”)。
SQL 中是否有一种方法可以使用与 Excel 方法相同的方法对 Sample 列进行排序,反之亦然?
最佳答案
SQL Server 排序由数据库、表或字段排序规则决定。默认情况下,这是标准的字典顺序字符串排序(连字符的字符代码在数字上低于 1 的字符代码)。不幸的是,根据this Microsoft link ,Excel在排序时忽略连字符和撇号,除了平局之外。没有专门执行此操作的排序规则(据我所知),因此您必须伪造它。
要在 SQL Server 中获得相同的结果,您需要执行以下操作:
SELECT [Sample], [Flag] FROM Samples
ORDER BY REPLACE(REPLACE([Sample], '-', ''), '''', ''),
(CASE WHEN CHARINDEX([Sample], '-') > 0 THEN 1 ELSE 0 END) +
(CASE WHEN CHARINDEX([Sample], '''') > 0 THEN 1 ELSE 0 END) ASC
这会按字符串对结果进行排序,就像删除了所有连字符和撇号一样,然后按计算值排序,将产生 1
对于包含连字符或撇号的任何值,或 2
对于包含两者的任何值(0
对于两者都不包含的值)。此表达式将导致任何包含连字符和/或撇号的值在其他等效的表达式之后排序,就像 Excel 一样。
关于sql-server - Excel 和 SQL 排序之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3299905/