Lets dire que j'ai base de données avec une table de mots, comme ceci:requête SQLite retour ordonné coups sensibles à la casse et insensibles à la casse
CREATE TABLE Words (
Id integer PRIMARY KEY NOT NULL,
Word text NOT NULL
);
CREATE INDEX Word_Index ON Words (Word ASC);
sqlite> SELECT * FROM Words;
Id|Word
1|apple
2|Apple
3|Jack
4|jack
Pour garder les choses simples, laisse juste dire que je ne garde à propos des caractères ascii, dans la mesure où la sensibilité de la casse va. Ce que je voudrais faire est d'effectuer une recherche de Word et retourner d'abord la ligne qui renvoie la correspondance exacte sensible à la casse, suivie par toutes les lignes qui correspondent, en ignorant la casse, sans doublons. Ainsi, par exemple, SELECT * FROM mots OU ... 'd'Apple' renverrait:
2|Apple
1|apple
et même, SELECT * FROM mots de la recherche ... 'pomme' renverrait:
1|apple
2|Apple
Je suis principalement concerné par les correspondances sensibles à la casse, mais souhaiterais qu'elles soient suivies par des correspondances insensibles à la casse, en tant que solution de repli. Je m'attends à ce que généralement j'obtiens des hits pour les correspondances sensibles à la casse, c'est pourquoi j'ai un index sensible à la casse. Je me rends compte que le repli insensible à la casse ne pourra pas utiliser l'index, mais je choisis de ne pas avoir un deuxième index (COLLATE NOCASE) afin d'économiser de l'espace dans ma base de données, car il serait probablement rarement utilisé . Habituellement, je vais seulement marcher une fois, en attrapant le premier coup.
Quel est le moyen le plus efficace de le faire?
Cela semble définitivement fonctionner, mais le plan de requête indique qu'il n'utilise pas l'index: --EQP-- 0,0,0, SCAN TABLE Mots --EQP-- 0,0,0, USE TEMP B-TREE FOR ORDER BY J'aimerais pouvoir utiliser l'index dans les cas où je n'effectue qu'une seule étape pour saisir le premier hit (sensible à la casse), s'il en existe un. – hyperspasm