1

我的NLS设置:

NLS_SORT    POLISH
NLS_COMP    BINARY

简单测试查询:

select * from (
  select '11117' as x from dual
  union
  select '12988' as x from dual
  union 
  select '14659' as x from dual
  union 
  select '1532' as x from dual
  union 
  select '18017' as x from dual
) order by x;

实际结果:

x
-----
11117
12988
14659
1532
18017

期望的结果:

x
-----
1532
11117
12988
14659
18017

问题:

有没有NLS可以帮助我达到预期结果的设置?我知道我可以做order by to_number(x),甚至更好,order by lpad(x, 5)但在这种情况下并不好 - 我需要一个不需要更改查询的系统范围的解决方案。

我尝试了什么:

  • order by nlssort(x, 'nls_sort=binary');
  • alter session set nls_sort='binary';
4

1 回答 1

0

也许一个有点奇怪的解决方案,但是......

  1. 将您的 TABLE_SOMETHING 重命名为 TABLE_OTHER。
  2. 在 TABLE_OTHER 之上创建一个视图 TABLE_SOMETHING ,它将 TO_NUMBER() 将您的问题字符串列添加到相同的列名。
  3. 如果表在应用程序范围内被修改,则在视图 TABLE_SOMETHING 上创建 INSTEAD OF 触发器。
  4. 重新编译可能无效的包。

在修改大量记录时不会特别高效,不允许截断表,但它可能会解决排序问题。

于 2014-06-24T19:13:38.673 回答