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



在 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小提琴上的演示

请注意,这将比执行二进制排序慢。

最新更新