繁体   English   中英

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

[英]Result like Oracle query in SQL Server 2016

例如在 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 Server 中,您可以在使用 COLLATE 时强制进行排序。 尝试下面的脚本,您应该以这种方式获得预期的输出。

在这里演示

SELECT * 
FROM test1 
ORDER BY prod_name 
    COLLATE SQL_Latin1_General_CP850_BIN2

这很棘手。 Oracle 和 SQL Server 有不同的排序规则。 Oracle 默认执行二进制排序,它基于字符编码方案定义的字符的数值(这是最快的方法)。

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

产生预期结果的一种方法是进行语言排序:使用此设置,字符的排序独立于它们在字符编码方案中的数值

我尝试了这些参数,这是一个按预期排序的解决方案:

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

DB Fiddle 上的演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM