【问题标题】:Advanced usage of "like" statement in sqlitesqlite中“like”语句的高级用法
【发布时间】:2011-03-20 16:36:49
【问题描述】:

我现在正在 iPhone 平台上的 sqlite 上工作,并处理带有一些奇怪实体的数据库。该数据库中的一列称为类型,它允许多个值(多种类型)。这一栏的数据是这样的:

1|9|20|31|999

表格是这样的:

ID       TYPE
------------------------
1        1|9|20|31|999
2        5|13|15|30|990
3        6|7|45|46|57

当用户要选择类型为9的数据时,需要选择上面的数据,因为实体包含9。我使用如下语句执行:

SELECT id
  FROM table 
 WHERE type LIKE '%' || ? || '%'

问题是类型为 999 的数据和没有类型 9 的数据也会被选中。另外,如果用户要选择类型1,那么类型为11、12、13...等的数据也会被选中。

我尝试使用语句:

SELECT id
  FROM table 
 WHERE type LIKE '[^0123456789]' || ? || '[^0123456789]'

但它不能选择任何数据。

如何选择正确类型的数据?

(因公司要求,不能更改数据库)

【问题讨论】:

  • 这看起来像是一个正则表达式问题。不作为答案发布,因为我没有提供表达式本身。 :)
  • 附注- 更努力地更改数据库 - 这太可怕了,一开始就这样做,你最终会节省更多。
  • 谢谢大家。已经被 bw_üezi'answer 解决了

标签: iphone sqlite sql-like


【解决方案1】:

您需要一个仅匹配 'yournumber|''|yournumber|''|yournumber' 或以上组合的正则表达式。我认为优化器不可能在这种事情上使用索引,而不是与全文索引类似的专用索引。

这几乎是没有希望的,除非您拥有微不足道的数据量(或太多的处理资源),否则它不会扩展。

如果数据量很小,可以考虑只选择like '%number%',并在您的应用程序代码中进行一些后处理。

否则,规范化你的数据。

【讨论】:

    【解决方案2】:

    你可以试试这个

    SELECT id
      FROM table 
     WHERE '|' + type + '|' LIKE '%|' + ? + '|%'
    

    (我在这里使用+ 运算符,因为它更易于阅读,但您也可以使用|| 代替)

    这是一个没有正则表达式的简单解决方案。索引在这里没有任何帮助(这与正则表达式解决方案相同)查询会因大量数据而变慢。

    我有一个类似的question 不久前我问过自己。还要检查它是answer

    【讨论】:

      【解决方案3】:

      我对 SQLite 不太熟悉,但是:

      SELECT id FROM table WHERE type REGEX '(^9\|.*)|(.*\|9\|.*)|(.*\|9$)';
      

      假设您正在寻找类型9

      然后查找类型999 将是:

      SELECT id FROM table WHERE type REGEX '(^999\|.*)|(.*\|999\|.*)|(.*\|999$)';
      

      请注意,如果您可能在 type 字段中有单个类型值,您可能需要调整表达式,因为在这种情况下,我假设不会有任何 | 字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2020-09-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        相关资源
        最近更新 更多