【问题标题】:Indexing mixed-type columns in SQLite在 SQLite 中索引混合类型的列
【发布时间】:2022-11-11 00:58:41
【问题描述】:

我在 SQLite 表中有一个包含数字和文本值的列。是否可以创建部分索引,一个用于数值,一个用于文本值,以便针对数字和文本数据的查询将使用适当的索引?或者,是否有一些“规范”的方法来解决这个问题,即索引/查询文本/数字混合类型的列?

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    简短的回答 - 一切实际上都非常简单,应该只在SQLite Forum 上按答案工作:

    我相信您可以简单地将您的内容放入数据库中,然后查询它,一切都会正常工作。

    CREATE TABLE t1(a INTEGER PRIMARY KEY, data BLOB);
    CREATE INDEX t1data ON t1(data);
    

    您不需要特殊索引。您不需要在查询中做任何特别的事情。它会起作用的。

    不要想太多。

    ==================================================== ===============

    官方docs 提供了更多详细信息,尽管相关部分在数据类型页面上,其中详细介绍了 SQLite 中涉及混合类型数据的比较/排序(以及索引)操作逻辑。单个索引就足够了,因为 SQLite 本质上将所有数值放在一个组中,将文本值放在另一组中。涉及数字过滤器的查询将使用数值与数值进行比较,而文本文件管理器将使用文本与文本值进行比较(这适用于精确过滤器、两侧有约束的范围过滤器和模式文本过滤器。)

    然而,为了实现直观的行为,将混合类型列声明为 BLOB 或 NUMERIC(取决于表示数字的文本文字是否应存储为数字)并将数字作为数字文字插入到 BLOB 列中是很重要的。如果该列声明为 TEXT,数值将存储为文本,并且数值查询将无法正常工作。

    此外,仍然可以在 BLOB 列上指定排序规则:

    CREATE TABLE t1(a INTEGER PRIMARY KEY, data BLOB COLLATE NOCASE);
    CREATE INDEX t1data ON t1(data);
    

    这样,文本查询将忽略大小写,而数字查询不会受到影响。

    【讨论】:

      猜你喜欢
      • 2014-08-25
      • 1970-01-01
      • 2018-05-12
      • 2015-02-06
      • 1970-01-01
      • 2018-10-10
      • 2020-09-06
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多