【问题标题】:sql Order by Query to display the name in ordersql Order by Query 按顺序显示名称
【发布时间】:2013-07-04 06:40:16
【问题描述】:

我在我的 sql 查询中使用 按名称排序
以下是我表中的名称。

rama1  
rama2  
rama10    
rama3  
rama11

我正在使用查询来显示名称按名称排序
输出就像,

rama1  
rama10  
rama11  
rama2  
rama3

但我需要的输出应该是,

rama1  
rama2  
rama3  
rama10  
rama11  

请帮我查询上面的输出。

提前致谢

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 所有记录中都有“rama”这个词吗?是否所有记录都以数字结尾,您必须按顺序排列?
  • @voo..yes..ram 在我的表的所有行中都存在,并以数字结尾
  • 这有关系吗?他的问题是,当按字母顺序排序时,10 排在 3 之前,因为 1 排在 3 之前。如果 DBS 不支持这种排序,我认为您可能需要在程序中“手动”进行排序
  • @billdoor 是的,这很重要,因为在这种情况下,他可以选择这个删除“rama”部分,然后将其转换为数字并进行正确的排序。这种排序在大多数 RDBMS 中用于字符串数据类型。告诉我 DBS 支持他想要的那种字符串排序?

标签: sql


【解决方案1】:

我想您的表格结构有误。您应该有一个单独的列,例如数字数据类型的 ID,您可以在其中保留您的 rama 数字部分。在这种情况下,您无需开发自行车就可以进行此类查询。

在您的情况下,您可以从字符串中获取数字部分(请参阅How to get the numeric part from a string using T-SQL? for ms sql)并按其排序。但这是错误的方式。

【讨论】:

    【解决方案2】:

    试试这个

    SELECT col FROM Table1
    ORDER BY 
    CASE WHEN PatIndex('%[0-9]%',col) > 0
          THEN RIGHT(col,LEN(col)- (PatIndex('%[0-9]%',col)-1)) * 1
          ELSE col END   
    

    DEMO

    【讨论】:

      【解决方案3】:

      查询:

      SELECT t1.*
      FROM Table1 t1
      ORDER BY CAST(REPLACE(t1.col, 'rama', '') AS UNSIGNED) ASC
      

      结果:

      |    COL |
      ----------
      |  rama1 |
      |  rama2 |
      |  rama3 |
      | rama10 |
      | rama11 |
      

      【讨论】:

      • +1 用于回答,+n(如果可以的话)用于介绍data.stackexchange。它很好:)
      【解决方案4】:

      请尝试:

      select *
      From tbl
      order by CAST(SUBSTRING(col, PATINDEX('%[0-9]%', col+'0'), 10) as int)
      

      【讨论】:

        猜你喜欢
        • 2019-11-22
        • 2011-09-13
        • 2015-11-04
        • 1970-01-01
        • 2012-02-25
        • 2011-03-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多