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

时间:2013-05-29 21:26:57

标签: 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中运行查询时,它首先返回按 LETTERS排序的数据,然后返回NUMBERS 。 e.g:

'A zone'
'Her zone'
'My zone'
'Zone'
'1st place'
'2nd place'

但是当我运行应用程序时,结果首先是 NUMBERS,然后是LETTERS ! e.g:

'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的组件顺序,即 NUMBERS然后是LETTERS 。但这不是所希望的,因为用户的自然顺序是 LETTERS,然后是NUMBERS

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

1 个答案:

答案 0 :(得分:1)

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

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

您也可以仅使用值调用nlssort,而不是指定第二个参数,并在会话中设置默认排序(在连接到数据库之后)。这样做的好处是,您可以在以后轻松地对其进行全局更改,甚至让用户选择他们喜欢的排序方式:

ALTER SESSION SET NLS_SORT = 'BINARY_AI';

反过来,您可以检查当前的排序:

select value from v$nls_parameters
WHERE parameter = 'NLS_SORT'