【问题标题】:How to query a varchar2 field which has numerical values using order by desc in sql如何在 sql 中使用 order by desc 查询具有数值的 varchar2 字段
【发布时间】:2020-12-03 12:58:19
【问题描述】:

我有一个带有 varchar 2 数据类型列的表,现在我想按 desc 顺序获取记录列和持续时间列,但没有按预期工作。

查询:

select * from sampletable2
where code = 'C'
order by  duration desc ;

QUERY 输出如下所示:

    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      
        

有人可以纠正我哪里出错并纠正我的查询吗?

【问题讨论】:

  • 我看不出您的查询如何产生第一个结果,无论数据类型如何,除非您在数据中有隐藏字符。存储为字符串的数字是什么?
  • 无论是什么数据类型,您的查询都无法返回指定的输出。
  • @GordonLinoff 看起来records 列包含前导空格,而且它们的数量因行而异。
  • 尝试在一些在线小提琴上重现该问题。
  • @Akina 没有前导空格或行与其他行不同。它只是在此处输入时格式化。只是你忽略那些

标签: sql oracle plsql


【解决方案1】:

怎么样

order by to_number(duration) desc

如果duration 包含数字,它应该可以工作。另外,如果是这样,为什么要在VARCHAR2 列中保留数字?


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

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

【讨论】:

    【解决方案2】:

    您可以使用to_numberon conversion error 如下:

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

    通过这个方案,你最终会得到所有非数值记录。

    【讨论】:

      【解决方案3】:

      这回答了问题的原始版本。

      我看不到您的查询是如何产生第一个结果的。但是如果你想按 numeric 值排序,那么你可以转换为数字:

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

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

      【讨论】:

      • 之前用 to_number 尝试过,但它抛出的数字无效
      • @HemanthTanna 。 . .然后你有坏数据,你的问题没有具体说明如何处理非数字数据。
      猜你喜欢
      • 2021-03-23
      • 1970-01-01
      • 2015-11-30
      • 1970-01-01
      • 2021-07-14
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多