【问题标题】:How to sort by text first and then text containing numbers如何先按文本排序,然后按包含数字的文本排序
【发布时间】:2013-07-18 08:31:30
【问题描述】:

在 Sqllite 表中,我在表中有一个列值,例如

  • 马里奥
  • 飞机
  • 邪恶的死者
  • 4十字数独
  • 20十字数独
  • 15十字数独
  • 模拟城市

我如何排序以首先具有文本,然后对带有数字前缀的文本进行排序。

需要输出:

  • 邪恶的死者
  • 飞机
  • 马里奥
  • 模拟城市
  • 4十字数独
  • 15十字数独
  • 20十字数独

【问题讨论】:

标签: android sql database sqlite sorting


【解决方案1】:

你可以试试这个

SELECT * 
  FROM Table1
 ORDER BY CAST(column1 AS INTEGER), column1

输出:

|第 1 列 | ------------------ |邪恶的死者 | |飞机 | |马里奥 | |模拟城市 | | 4 十字数独 | | 15十字数独 | | 20十字数独 |

这里是SQLFiddle演示

【讨论】:

  • 0 启动字符串将失败。
  • @LS_dev 公平点,但这可能不是真实数据的问题
【解决方案2】:
SELECT * FROM  [table] ORDER BY [column] GLOB '[0-9]*', [column];

会成功的。

SELECT * FROM [table] ORDER BY CAST([column] AS INTEGER), [column];

可能会更快,但0 开始的字符串会出现在文本之前。

编辑:

更好的选择:

SELECT * FROM [table] ORDER BY TYPEOF([column])='text' DESC, [column];

【讨论】:

    【解决方案3】:

    SQL中对列进行排序的语法如下:

    SELECT   [columns]
    FROM     [table(s)]
    WHERE    [conditions]
    ORDER BY [columnName] ASC, [columnName] ASC, [columnName] ASC
    

    您可以根据需要按任意多列进行排序(我在此示例中使用了三列),并且可以将 ASC 替换为 DESC 以进行升序或降序排序。

    http://www.tutorialspoint.com/sqlite/sqlite_order_by.htm

    我会在第一个字母上使用 IFNULL 语句首先测试一个数字,并将其作为排序顺序的一部分:

    SELECT *
    FROM testSort
    ORDER BY IFNULL(substr(name,1) + 1, 0), name
    

    http://sqlfiddle.com/#!7/84fe6/9

    【讨论】:

    • 如何帮助获得 OP 所需的输出?
    • @peterm 好点,没有看到数字位,我添加了一个 IFNULL 来测试一个数字并按此排序
    【解决方案4】:

    如果这必须在 sql 中完成,您可以使用

    select columnName from table ORDER BY round(columnName) ASC, columnName ASC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-28
      • 2013-06-29
      • 1970-01-01
      • 2021-09-13
      • 2020-09-03
      • 1970-01-01
      • 2014-01-18
      • 2023-03-30
      相关资源
      最近更新 更多