使用随机字符分隔符匹配 SQLite 中的数字序列

Posted

技术标签:

【中文标题】使用随机字符分隔符匹配 SQLite 中的数字序列【英文标题】:Matching number sequences in SQLite with random character separators 【发布时间】:2014-05-15 22:12:02 【问题描述】:

我有一个 sqlite 数据库,其中包含带有随机分隔符的数字序列。例如

_id  data             
0    123-45/678>90
1    11*11-22-333
2    4-4-5-67891

我希望能够使用和不使用分隔符“智能地”查询数据库。例如,这两个查询都返回 _id=0

  SELECT _id FROM myTable WHERE data LIKE '%123-45%'
  SELECT _id FROM myTable WHERE data LIKE '%12345%'

第一个查询按原样工作,但第二个查询是问题所在。因为分隔符随机出现在数据库中,所以搜索词中的组合太多,无法循环。

我可以创建两列,一列有分隔符,一列没有,对每一列运行每个查询,但数据库很大,所以我想尽可能避免这种情况。

有什么方法可以构造第二个查询来实现这一点吗?查询期间每一行的正则表达式之类的东西?伪代码

  SELECT _id 
  FROM myTable 
  WHERE REPLACEALL(data,'(?<=\\d)[-/>*](?=\\d)','') LIKE '%12345%'

【问题讨论】:

为什么“庞大”的数据库会让您不想再添加一列? 【参考方案1】:

好的,这远非很好,但您可以直接嵌套REPLACE 函数。示例:

SELECT _id FROM myTable
WHERE REPLACE(..... REPLACE(REPLACE(data,'-',''),'_',''), .... '<all other separators>','') = '12345'

在实践中使用它时(我不推荐它,但至少它很简单),你肯定可以将它包装在一个函数中。

编辑:有关REPLACE 函数的小文档,请参见here,例如。

【讨论】:

【参考方案2】:

如果我猜对了,这就是你想要的吗?

SELECT _id
FROM myTable
WHERE Replace(Replace(Replace(data, '?', ''), '/', ''), '-', '') LIKE '%12345%'

【讨论】:

以上是关于使用随机字符分隔符匹配 SQLite 中的数字序列的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 去除字段中的非数字字符

如何停止。在 SQLite FTS4 中被视为分隔符

SQLite:一个单词中的FTS匹配可以忽略哪个字符

RegEx 用于匹配除逗号分隔的数字之外的所有字符

java 正则表达式匹配字符串,包含没有数字的单词,并且可以选择用逗号分隔

初步学习正则表达式