delphi - 如何设置 TDBGrid 排序中的字符顺序?

标签 delphi sorting oracle10g delphi-2007 tdbgrid

我正在使用连接到 TDataSource 的 TDBGrid。
此 TDataSource 使用 TADOQuery 作为其数据集。
TADOQuery 连接到 Oracle10g 数据库并保存以下查询:

SELECT ST.desc
FROM my.subsection ST
WHERE  ST.date_disp  = :dated
ORDER BY ST.desc

ST.desc 是一个字符串,通常包含如下数据:
'1st place'
'2nd place'
'A zone'
'Her zone'
'My zone'
'Zone'

一切正常,除了当我在 SQLTools 中运行查询时,它返回按 排序的数据首先是字母,然后是数字 .
例如。:
'A zone'
'Her zone'
'My zone'
'Zone'
'1st place'
'2nd place'

但是当我运行应用程序时,结果是 首先是数字,然后是字母 !例如:
'1st place'
'2nd place'
'A zone'
'Her zone'
'My zone'
'Zone'

我发现 Oracle 使用一种排序语言(http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch5lingsort.htm)和一些 Delphi 组件(TDBGrid 或 TDataSource?)另一种。

然后我尝试使查询结果符合 Delphi 的组件顺序,即 数字后字母 .但这是不希望的,因为用户的自然顺序是 字母,然后是数字 .

有谁知道我如何确定哪个组件正在“重新排序”数据以及如何使两个排序顺序相同?

最佳答案

您可以使用 NLSSORT 函数指定使用哪种排序/比较。

SELECT ST.desc
FROM my.subsection ST
WHERE  ST.date_disp  = :dated
ORDER BY 
  NLSSORT(ST.desc, 'NLS_SORT=BINARY_AI')

除了指定第二个参数,您还可以仅使用值调用 nlssort,并在 session 中设置默认排序(在连接到数据库之后)。这样做的好处是,您可以在以后轻松地对其进行全局更改,甚至让用户选择他们喜欢的排序方式:
ALTER SESSION SET NLS_SORT = 'BINARY_AI';

反过来,您可以检查当前排序:
select value from v$nls_parameters
WHERE parameter = 'NLS_SORT'

关于delphi - 如何设置 TDBGrid 排序中的字符顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16824125/

相关文章:

delphi - TTreeView - 更改展开和折叠图像?

c# - 为什么保存记录时Guid会改变?

asp.net - ORACLE/ASP.NET : ORA-2020 - Too many database links. ..是什么原因造成的?

delphi - 在 Delphi 7 中将局部变量从一个过程发送/传递到另一个过程?

delphi - 对第二个数组中的字符进行排序,同时将其替换为旧数组中的 '*'

delphi - 获取程序可执行文件的名称(如 paramstr(0) 中),但在 Delphi 7 中将其作为 Unicode 字符串获取?

c - qsort 是否需要一致的比较,或者我可以用它来洗牌吗?

javascript - 如何按日期对 Javascript 对象数组进行排序?

sql-server - List<Guid> 中的降序顺序与 IQueryable OrderByDescending 不同

sql - 如何根据前一行的舍入值递归计算剩余金额的比率?