sql-server - Excel 和 SQL 排序之间的差异

标签 sql-server excel sorting

使用的程序:

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/

相关文章:

SQL Server json 被截断(即使使用 NVARCHAR(max) 时也是如此)

c# - 不存在数据时,SqlDataReader 无效尝试读取

excel - 仅在保存工作簿时根据单元格中的值发送电子邮件

excel - 如果两个单元格匹配,则从同一行中的第三个返回值,而与 Excel 中的顺序无关

perl - 奇怪的行为

Ruby 以相反的顺序按条件对数组进行排序

sql - 是否可以使用列序号位置选择sql server数据

c# - 比较 C# 的 DateTime.now 和 SQL 中的 GetDate() 的准确性

excel - 解析 CSV,忽略 VBA 中字符串文字内的逗号?

sorting - Elasticsearch 通配符查询以获取排序结果