【问题标题】:Result like Oracle query in SQL Server 2016结果类似于 SQL Server 2016 中的 Oracle 查询
【发布时间】:2020-01-21 09:01:36
【问题描述】:

例如在 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


    【解决方案1】:

    在 SQL Server 中,您可以在使用 COLLATE 时强制进行排序。试试下面这个脚本,你应该可以通过这种方式获得预期的输出。

    DEMO HERE

    SELECT * 
    FROM test1 
    ORDER BY prod_name 
        COLLATE SQL_Latin1_General_CP850_BIN2
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      Demo on DB Fiddle

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 2016-03-31
        • 2014-05-30
        • 2019-01-07
        • 2020-11-07
        • 2019-06-25
        相关资源
        最近更新 更多