【问题标题】:Why do we need the GLOB clause in SQLite?为什么我们需要 SQLite 中的 GLOB 子句?
【发布时间】:2014-06-18 08:42:59
【问题描述】:

我是一名 Android 开发人员,最近在 SQLite 中遇到了 GLOB 子句。鉴于 LIKE 已经到位,我无法理解为什么我们需要 GLOB。

两个子句都有通配符来表示单个和多个字符。唯一的区别是 GLOB 区分大小写。

但仅此而已吗?是否有任何疑问 LIKE 是一个不好或不合适的选择?是否存在我们绝对必须使用 GLOBE 与 LIKE 或反之亦然的情况?

【问题讨论】:

    标签: sql sqlite android-sqlite glob sql-like


    【解决方案1】:

    区分大小写本身很有用,因为这对普通索引更有效。

    此外,GLOB 还支持字符类:

    通配规则:

    * 匹配任何零个或多个字符的序列。

    ? 只匹配一个字符。

    [...] 匹配所附字符列表中的一个字符。

    [^...] 匹配一个不在封闭列表中的字符。

    通过[...][^...] 匹配,可以包含] 字符 在列表中将其设为[^ 之后的第一个字符。一种 可以使用- 指定字符范围。例子: [a-z] 匹配任何单个小写字母。要匹配 -,请 它是列表中的最后一个字符。

    【讨论】:

    • 感谢@CL。所以看起来唯一的额外就是最小的 REGEX 功能。
    【解决方案2】:

    GLOB 将在很多情况下使用索引,而 like 不会,对于少量数据,这种差异将是微不足道的,但对于大量数据,这可能会对性能产生巨大影响。

    查找数据(使用索引)比表扫描快得多,表扫描处理表中的所有行以找出符合条件的行,查找使用索引来查找数据。

    所以看下面的例子(已经为 lastname 列创建了索引)

    select * from table1 where lastname like 'brown'
    

    select * from table1 where lastname glob 'brown'
    

    第一个示例执行表扫描(未使用索引),第二个示例使用索引。

    glob 真正发挥作用的地方是替换搜索条件中的字符,所以 glob 'brow?'仍然使用索引,glob 'brow%' 也将使用索引,表扫描用于等效的类似命令。

    【讨论】:

      猜你喜欢
      • 2012-07-18
      • 2015-03-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2014-06-18
      • 2017-02-26
      相关资源
      最近更新 更多