我在 Sqlite 中有以下类型的数据集:
person_id | 税号 | 税 |
---|---|---|
1 | 123 | 2000 |
2 | 空 | 空 |
3 | 321 | 3000 |
4 | 空 | 空 |
因此,对于许多观察结果来说,
tax_id
就是 NULL
。我会经常按那些 tax_id is not NULL
进行过滤,并且我想基于此创建一个索引。是否可以?我不关心 tax_id
数字本身,我只关心这个人有一个 tax_id
。
简单的答案是创建一个新列,如果
1
则使用 tax id is not Null
,否则使用 0
,然后基于这个新列建立索引。但看起来不太优雅。
这称为“部分索引”。您在末尾添加 WHERE 子句。
CREATE INDEX idx_taxes ON taxes(tax_id) WHERE tax_id IS NOT NULL;
您可以在表达式上创建索引!
CREATE INDEX "taxes(tax_id IS NOT NULL)"
ON taxes(tax_id IS NOT NULL)
唯一需要注意的是,要让 sqlite 使用此查询,您必须使用一个看起来相当奇怪的条件:
SELECT * FROM taxes
WHERE (tax_id IS NOT NULL) == TRUE
虽然我认为这对于存储或计算来说并不是“更有效”(正如@PChemChuy的答案的评论中指出的那样),但我仍然认为它很酷🤷u200d♀️