如何在sql中使用order by desc查询具有数值的varchar2字段
我有一个带有varchar 2 datatypes列的表,现在我想按desc order的顺序获取records列和duration列,但不是我期望的工作数据 查询:如何在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
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 . . . 然后你就有了糟糕的数据,你的问题没有说明如何处理非数字数据。