Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在sql中使用order by desc查询具有数值的varchar2字段_Sql_Oracle_Plsql - Fatal编程技术网

如何在sql中使用order by desc查询具有数值的varchar2字段

如何在sql中使用order by desc查询具有数值的varchar2字段,sql,oracle,plsql,Sql,Oracle,Plsql,我有一个带有varchar 2 datatypes列的表,现在我想按desc order的顺序获取records列和duration列,但不是我期望的工作数据 查询: select * from sampletable2 where code = 'C' order by duration desc ; 查询输出如下所示: KeyNumber ID Code BRANCH records Duration A907654

我有一个带有varchar 2 datatypes列的表,现在我想按desc order的顺序获取records列和duration列,但不是我期望的工作数据

查询:

select * from sampletable2
where code = 'C'
order by  duration desc ;
查询输出如下所示:

    KeyNumber       ID    Code   BRANCH  records   Duration
             
    A907654234      4      C      ALA     100      99  
    A875678235      3      C      PHE     30       9  
    A123456789      1      C      HIE     78       45   
    A907863544      5      C      VAL     50       23   
我想要的是:

    KeyNumber       ID    Code   BRANCH  records   Duration
    A907654234      4      C      ALA     100      99 
    A123456789      1      C      HIE     78       45 
    A907863544      5      C      VAL     50       23     
    A875678235      3      C      PHE     30       9      
        
有人能纠正我哪里出了问题并纠正我的疑问吗?

怎么样

order by to_number(duration) desc
如果
duration
包含数字,它应该可以工作。而且,如果是这样,为什么要在
VARCHAR2
列中保留数字


若列包含其他内容,而不仅仅是数字,那个么请查看正则表达式是否有帮助。例如:

order by to_number(regexp_substr(duration, '\d+')) desc, duration
怎么样

order by to_number(duration) desc
如果
duration
包含数字,它应该可以工作。而且,如果是这样,为什么要在
VARCHAR2
列中保留数字


若列包含其他内容,而不仅仅是数字,那个么请查看正则表达式是否有帮助。例如:

order by to_number(regexp_substr(duration, '\d+')) desc, duration

这回答了问题的原始版本

我看不出您的查询是如何产生第一个结果的。但如果要按数值排序,则可以转换为数字:

order by to_number(records) desc, to_number(duration) desc ;

也就是说,更好的方法是修复数据模型。您不应该将数字存储为字符串。

这回答了问题的原始版本

我看不出您的查询是如何产生第一个结果的。但如果要按数值排序,则可以转换为数字:

order by to_number(records) desc, to_number(duration) desc ;

也就是说,更好的方法是修复数据模型。您不应该将数字存储为字符串。

您可以使用
来存储数字
和转换错误时的
,如下所示:

order by to_number(duration default -1 on conversion error) desc

使用此解决方案,您将最终获得所有非数值记录。

您可以使用
来记录数值
转换错误
,如下所示:

order by to_number(duration default -1 on conversion error) desc

使用此解决方案,您将最终获得所有非数值记录。

我不知道您的查询如何生成第一个结果,无论数据类型如何,除非数据中有隐藏字符。什么是存储为字符串的数字?无论数据类型是什么,您的查询都无法返回指定的输出。@GordonLinoff看起来像
记录
列包含前导空格,它们的数量因行而异。请尝试在一些在线小提琴上重现该问题。@Akina没有leadinf空格,或其他行的行数不同。它只是在这里打字时格式化。只要忽略这些,不管数据类型如何,我都看不到查询如何生成第一个结果,除非数据中有隐藏字符。什么是存储为字符串的数字?无论数据类型是什么,您的查询都无法返回指定的输出。@GordonLinoff看起来像
记录
列包含前导空格,它们的数量因行而异。请尝试在一些在线小提琴上重现该问题。@Akina没有leadinf空格,或其他行的行数不同。它只是在这里打字时格式化。只是您忽略了之前尝试过的获取无效数字查看更新的答案(使用regex)。之前尝试过的获取无效数字查看更新的答案(使用regex)。之前尝试过的使用to_number,但其抛出无效number@HemanthTanna . . . 然后您的数据不正确,并且您的问题没有指定如何处理非数字数据。之前尝试了to_number,但无效number@HemanthTanna . . . 然后你就有了糟糕的数据,你的问题没有说明如何处理非数字数据。