首页 > 解决方案 > 带有'_'的 Varchar2 的 Oracle SQL 订单

问题描述

我有一个带有 varchar2 列的表。按该列排序并没有给我预期的结果:

with test (col) as
  (select '_83_' from dual union all
   select '_81_' from dual union all
   select '4___' from dual union all
   select '____' from dual
  )
select * from test
order by col desc;

返回:

Col 
1. '_83_'
2. '_81_'
3. '4___'
4. '____'

我确实期望:

Col 
1. '4___'
2. '_83_'
3. '_81_'
4. '____'

你能解释一下并帮助我'4___'通过声明开始我的订单吗?

使用 Littlefoots 语句编辑可预生产性...

编辑我正在使用 Oracle 12c

编辑 NLS_Sort 设置为德语。这就是问题所在。

标签: sqloraclesql-order-by

解决方案


在我的本地数据库中,NLS_SORT设置为BINARY所以不可重现。

WITH TEMO AS 
(
SELECT '_83_' AS X FROM DUAL UNION ALL
SELECT '_81_' AS X FROM DUAL UNION ALL
SELECT '4___' AS X FROM DUAL UNION ALL
SELECT '____' AS X FROM DUAL
)
SELECT * FROM TEMO ORDER BY X DESC;

X   
----
____
_83_
_81_
4___

但是,从 更改NLS_SORTBINARYGERMAN,该问题被重现。

ALTER SESSION SET NLS_SORT=GERMAN;

WITH TEMO AS 
(
SELECT '_83_' AS X FROM DUAL UNION ALL
SELECT '_81_' AS X FROM DUAL UNION ALL
SELECT '4___' AS X FROM DUAL UNION ALL
SELECT '____' AS X FROM DUAL
)
SELECT * FROM TEMO ORDER BY X DESC;

X   
----
_83_
_81_
4___
____

您可以使用下表检查 NLS 值:

NLS_SESSION_PARAMETERS
NLS_DATABASE_PARAMETERS

所以结论是NLS_SORT必须相应地设置参数,因为不是每个人都想使用技术进行排序。

的默认值NLS_SORT源自NLS_LANGUAGE

有关 NLS_SORT 的更多信息,请参阅oracle 文档

NLS_SORT解决方案是根据需要进行更改。

干杯!!


推荐阅读