【问题标题】:How to make Oracle and SQL Server ORDER BY the same?如何使 Oracle 和 SQL Server ORDER BY 相同?
【发布时间】:2020-05-21 15:19:40
【问题描述】:

我需要将 Oracle 模式的表计数与 SQL Server 数据库进行比较。但是,当我进行查询时,结果总是关闭,因为每个处理下划线('_')的方式在排序方面。我在下面提供了一个示例。

在甲骨文中:

SELECT FIELD1 FROM ORACLE_ORDER ORDER BY FIELD1 ASC;

Result:
'ABC'
'ABCD'
'ABC_D'

在 SQL Server 中:

SELECT FIELD1 FROM SQL_ORDER ORDER BY FIELD1 ASC;

Result:
'ABC'
'ABC_D'
'ABCD'

从上面可以看出,oracle 和 sql server 在排序时都以不同的方式处理下划线。如何修改任何一个查询(或环境)以使它们的顺序与另一个相同?

【问题讨论】:

  • 您使用的排序规则似乎不同。如果您使用默认排序规则,也许您应该明确添加它们。
  • 但问题是“SQL Server 中的哪些排序规则与 Oracle 中的排序规则兼容?”
  • @Martin Smith,需要由 OP 找到。先在SQL Server中找到什么排序规则,然后在oracle中找到对应的排序规则,在使用oracle字段时,必须转换为。
  • 也许将列转换为二进制,varbinary?无法访问 Oracle 系统,因此无法尝试。

标签: sql sql-server oracle


【解决方案1】:

在 SQL Server 端使用以下

Select * from SQL_ORDER  
ORDER BY FIELD1  Collate SQL_Latin1_General_CP850_BIN

排序规则 SQL_Latin1_General_CP850_BIN 使它可以与 ASCII 值一起使用。在这种情况下,下划线的 ASCII 为 95,A 为 65,Z 为 90。记住小写“a”的值将高于大写“A”,依此类推。

这里是fiddle

【讨论】:

  • 谢谢,你每个月为我节省了几个小时的工作时间!
【解决方案2】:

简单的方法是使用ORDER BY中的Collate SQL_Latin1_General_CP850_BIN函数来实现这个

SELECT * FROM (
SELECT 'ABC' AS TAB UNION
SELECT'ABC_D'UNION
SELECT'ABCD'UNION
SELECT'ABC_'UNION
SELECT 'ABC' UNION
SELECT'A_C' UNION
SELECT'ABC_DE_FGH'UNION
SELECT'ABCXDEYFGH') AS X 
ORDER BY X.Tab Collate SQL_Latin1_General_CP850_BIN

【讨论】:

  • 这可能适用于我制作的示例这样的表格,但它如何适用于行数明显更多的表格。
  • @Thiyagu - 那么如何处理“ABC”与“A_C”或“ABC_DE_FGH”与“ABCXDEYFGH”。恐怕您提出的解决方案过于简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多