在 Oracle 中,例如
create table test1(Prod_Name varchar2(30))
insert into test1 values('CHANNEL')
insert into test1 values('SHELL')
insert into test1 values('_DISTRIBUTOR BELT')
select * from test1 order by prod_name asc
选择查询给出以下结果
Prod_Name
CHANNEL
SHELL
_DISTRIBUTOR BELT
但在 SQL Server 中,它给出了以下结果
Prod_Name
_DISTRIBUTOR BELT
CHANNEL
SHELL
我希望结果与SQL Server中的Oracle相同,那么如何编写查询。澄清一下,我希望通道、外壳和_DISTRIBUTOR皮带行排在最后
在 SQL Server 中,您可以在使用 COLLATE 时强制排序规则。试试下面的脚本,你应该以这种方式获得预期的输出。
在这里演示
SELECT *
FROM test1
ORDER BY prod_name
COLLATE SQL_Latin1_General_CP850_BIN2
这很棘手。Oracle 和 SQL Server 具有不同的排序规则。默认情况下,Oracle 执行二进制排序,它基于字符编码方案定义的字符的数值(这是最快的方法(。
下划线字符 (_
( 的 ASCII 代码为 95,而 A-Z 的范围为 65 到 90。因此,您看到的结果。
产生预期结果的一种方法是执行语言排序:使用此设置,字符排序独立于字符编码方案中的数值。
我尝试了参数,这是一个按预期排序的解决方案:
select * from test1 order by nlssort(prod_name, 'nls_sort = punctuation')
DB小提琴上的演示
请注意,这将比执行二进制排序慢。