Lit*_*les 3 sql-server sorting excel
使用的程序:
SQL Server 2000,Excel 2003
我们的数据库中有一个名为Samples的表.使用以下查询...
SELECT [Sample], [Flag] FROM Samples
ORDER BY [Sample]
Run Code Online (Sandbox Code Playgroud)
...我们得到以下结果:
Sample Flag
---------- ----
12-ABC-345 1
123-45-AB 0
679-ADC-12 1
Run Code Online (Sandbox Code Playgroud)
当用户在Excel电子表格中具有相同的数据并按Sample列排序时,它们将获得以下排序顺序:
Sample Flag
---------- ----
123-45-AB 0
12-ABC-345 1
679-ADC-12 1
Run Code Online (Sandbox Code Playgroud)
出于好奇,为什么SQL和Excel中的排序之间存在差异(除了"因为它是Microsoft").
SQL中是否有一种方法可以在与Excel方法相同的方法中对Sample列进行排序,反之亦然?
SQL Server排序由数据库,表或字段排序规则确定.默认情况下,这是一个标准的词典字符串排序(连字符的字符代码在数字上低于1的字符代码).不幸的是,根据这个Microsoft链接,除了打破平局之外,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
Run Code Online (Sandbox Code Playgroud)
这会按字符串对结果进行排序,就好像它已删除了所有连字符和撇号一样,然后按计算值排序,这将计算1包含连字符或撇号2的任何值,或者包含两者的任何值(以及0对于既不包含).此表达式将导致包含连字符和/或撇号的任何值在其他等效的表达式之后进行排序,就像Excel一样.