【问题标题】:Sqlite sorting using regex使用正则表达式的 Sqlite 排序
【发布时间】:2014-11-20 05:35:37
【问题描述】:

使用正则表达式进行Sqlite排序

我在 sqlite db 文本字段(代码)中有行,其值如下:

M1 
M2/4527
M101
1
2/5
3/1003
101
102

我希望对所有以数字开头的行进行排序,然后是所有以字母 A 到 Z 开头的代码。

这是我最近得到的

rawdata = database.rawQuery("SELECT * FROM tablename ORDER BY CASE WHEN " + codes + " GLOB '*^[0-9]*' THEN CAST(" + codes + " AS INTEGER) ELSE CAST(" + codes + " AS TEXT) END, " + codes + " COLLATE NOCASE ASC", null);

这给了我这个:

1
101
102
2/5
3/1003
M1
M101
M2/4527

我想要达到的排序顺序是:

1
2/5
3/1003
101
102
M1
M2/4527
M101

包含斜线的代码如果更简单,可以忽略斜线和后面的字符,只要斜线前面的字符按照我的要求排序。所以 2/5 就是 2,3/1003 就是 3。

【问题讨论】:

  • 您不能使用自己的Comparator 检索值并使用 Java 对它们进行排序吗?
  • 如果在填充光标时证明这是不可能的,我会的。如果我可以使用 db.query 来完成,我的代码会变得更加简单。
  • 不确定 SQL 查询是否更简单。想象一下,稍后更改顺序/比较,并调试/修复该查询......这对于Comparator 来说可能并不简单,但至少更容易调试!
  • 在以字母开头的条目中,你能假设它们总是以一个字母开头吗?在数字条目中,是否有预期的限值?
  • 是的,以字母开头的代码将始终是一个字母。只是数字的代码可以是 1 到 5 位数字。然而,那些有 / 的可能会更长,因为它们实际上是两个带有分隔符的代码。

标签: java android regex sqlite sorting


【解决方案1】:

要正确对带有字母的行进行排序,您必须从字符串中提取该数字。

SELECT *
FROM TableName
ORDER BY CASE WHEN codes GLOB '[0-9]*'      THEN 0
              WHEN codes GLOB '[A-Z][0-9]*' THEN substr(codes, 1, 1)
              ELSE                               codes
         END,
         CASE WHEN codes GLOB '[0-9]*'      THEN CAST(codes            AS INT)
              WHEN codes GLOB '[A-Z][0-9]*' THEN CAST(substr(codes, 2) AS INT)
              ELSE                               codes
         END

【讨论】:

  • 谢谢,捕获任何字母的正则表达式是什么,而不仅仅是 M GLOB 'M[0-9]*'
  • 酷,快到了...但是现在对以字母开头的代码进行排序:M01、P2、M02、P3、M03 等。您认为有一种方法可以先排序吗?第一个字母然后是数字?谢谢你的帮助。
  • BTW + 1000000 代表什么?字符数,行数?
  • 已修复 - 感谢 CL,非常感谢您的帮助!现在我知道我可以使用 substr 作为查询的一部分,这也有助于处理其他事情。谢谢
【解决方案2】:

问题出在 GLOB 正则表达式上,改为

GLOB '[0-9]*'

让事情变得更好,但是以字母开头的代码后跟数字的代码在字母之后没有按数字排序(我想要的方式)。

【讨论】:

  • 是的,但是对于不以字母开头的代码和带有 / 的代码来说,这是朝着正确方向迈出的一步。希望有人可能有更多的见解来进行这些排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多