Sql 具有VARCHAR2数据类型的Order by列

Sql 具有VARCHAR2数据类型的Order by列,sql,oracle-apex,Sql,Oracle Apex,我有一个表,用户可以添加和编辑现有记录。当用户输入新记录时,修订设置为“-”,因为它是初始草稿。当用户编辑记录及其a“-”时,它会将修订设置为1。之后,如果再次编辑它,它将进行修订+1,这将是2。等等 我在Apex报告中显示记录的历史记录,该报告按版本排序。这在我达到版本10之前一直有效,因为我现在得到以下信息: 9 8 7 6 5 4 3 2 10 1 “——” 10应该从9开始,但它介于2和1之间。这是因为我的数据类型设置为VARCHAR2而不是NUMBER。是否可以这样正确订购: 10 9

我有一个表,用户可以添加和编辑现有记录。当用户输入新记录时,修订设置为“-”,因为它是初始草稿。当用户编辑记录及其a“-”时,它会将修订设置为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而不是“-”。不过,如果可以的话,我更喜欢短跑


谢谢。

我建议将其转换为一个数字,并使用零或null代替
'-'
。 数字列也有助于比较哪个版本更晚或查找相邻版本:

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

作为一种特殊情况,您需要检查
'-'
,因为将其转换为数字将失败。

我建议将其转换为数字,并使用零或null代替
'-'
。 数字列也有助于比较哪个版本更晚或查找相邻版本:

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

作为一种特殊情况,您需要检查
'-'
,因为将其转换为数字将失败。

使用数字类型,然后出于显示目的,您可以使用
当字段=0时,则“-”ELSE字段转换为字符串结尾作为修订str

(对转换为字符串的字段使用适当的函数!)

“字段”上的排序将自动为您工作(DESC),因为这只是一个正常的数字

编辑
例如:

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

使用数字类型,然后出于显示目的,您可以使用
当字段=0时,则“-”ELSE字段转换为字符串结尾作为修订str

(对转换为字符串的字段使用适当的函数!)

“字段”上的排序将自动为您工作(DESC),因为这只是一个正常的数字

编辑
例如:

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

不要在varchar列中存储数字。可以使用
NULL
,而不是使用“-”作为“initial”的值。不要在varchar列中存储数字。您可以使用
NULL
,而不是使用“-”作为“initial”的值。当我尝试转换字符时,出现以下错误:ORA-01722:无效数字。对吗?对我来说,如果你在列中找到一个“-”,那么它会显示0,否则会正常显示数字,如果不是相反的话?当我尝试转换字符时,我得到以下错误:ORA-01722:无效数字。对吗?对我来说,如果你在列中找到一个“-”,然后显示0,否则显示正常的数字,如果不是相反的话?请提供一个例子?我已将我的专栏改为数字,现在正在尝试完成您推荐的以下内容。请您提供一个示例?我已将我的列更改为Number,现在尝试完成您推荐的以下内容。