按COLUMN排序,其具有VARCHAR2数据类型

时间:2013-03-08 10:35:24

标签: sql oracle-apex

我有一个表,用户可以添加和编辑现有记录。当用户输入新记录时,修订版本设置为“ - ”,因为它是初始草稿。当用户编辑一个记录并且它是一个' - '时,它会将修订版设置为1.之后如果再次编辑它,它会修改版本+ 1,这将是2.依此类推..

我在Apex报告中显示记录的历史记录,该记录按修订版排序。这一直有效,直到我达到第10版,因为我现在得到以下内容:

9
8
7
6
5
4
3
2
10个
1
' - '

10应该从9开始,但它介于2和1之间。这是因为我的数据类型设置为VARCHAR2而不是NUMBER。是否可以像这样正确地订购它:

10
9
8
7
6
5
4
3
2
1
' - '

注意:修订可能会增长和增长,甚至可能达到100.最简单的方法是将数据类型更改为NUMBER并使用0而不是' - '。但是,如果可以的话,我更喜欢破折号。

谢谢。

2 个答案:

答案 0 :(得分:4)

我建议将其转换为数字并使用零或空而不是'-'。 数字列也有助于比较以后的版本或找到相邻版本:

select...
    where version_a > version_b

select...
    where version_a = version_b + 1

如果你有一个varchar字段,那么就需要特殊的逻辑。在我看来,如果你想将-显示为零,你可以在显示逻辑中轻松处理,而不是将它放在数据库中。

但是,如果你真的需要保留一个角色,你应该能够做到这样的事情:

order by case when column = '-' then 0 else to_number(column) end descending

您需要检查'-'作为特例,因为将其转换为数字会失败。

答案 1 :(得分:0)

使用数字类型,然后出于显示目的,您可以使用
包装该字段的返回值  CASE WHEN field=0 THEN '-' ELSE field-converted-to-string END as revisionStr
(使用适当的函数进行字段转换为字符串!)

对'field'进行排序将自动为您工作(DESC),因为它只是一个正常的数字。

修改
例如:

SELECT
  CASE WHEN revision=0 THEN
    '-' 
  ELSE
    RTrim(CAST(revision AS varchar(30))) 
  END AS revisionStr
FROM table
ORDER by revision DESC