结果类似于SQL Server 2016中的Oracle查询

问题描述 投票:2回答:2

例如在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相同,因此如何编写查询。为了澄清起见,我最后要CHANNEL,SHELL和_DISTRIBUTOR BELT行

sql sql-server oracle sql-order-by
2个回答
1
投票
在SQL Server中,使用COLLATE时可以强制排序规则。试试下面的脚本,您应该以这种方式获得预期的输出。

DEMO HERE

SELECT * FROM test1 ORDER BY prod_name COLLATE SQL_Latin1_General_CP850_BIN2


1
投票
这很棘手。 Oracle和SQL Server具有不同的排序规则。 Oracle默认情况下会执行

binary sort,它基于由字符编码方案定义的字符的数值(这是最快的方法)。

下划线字符(_)的ASCII代码为95,而A-Z的范围为65至90。因此,您看到的结果。

产生预期结果的一种方法是进行

语言排序

:使用此设置,对字符进行排序[独立于字符编码方案中的数值我玩弄参数,这是按预期排序的解决方案:

select * from test1 order by nlssort(prod_name, 'nls_sort = punctuation')

Demo on DB Fiddle

请注意,这比执行二进制排序要慢。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.