Демо - http://demobuh.skahin.ru
Пароль и логин: admin
Описание возможностей и онлайн использование: http://buh.skahin.ru
Разработка и исходный код: https://github.com/pihel/cash
Личный блог. Заметки о программировании и не только
createFunction('UPPER_UTF8', 'upper_ru', 1);
//array('SQLITE_DB', 'upper_ru') - если используете в составе класса 'SQLITE_DB'
?>
После этих нехитрых манупуляций в составе SQLite появится новая функция UPPER_UTF8 и с помощью ее можно будет делать регистронезависимые запросы:
SELECT
t.*
FROM
table t
WHERE
UPPER_UTF8(t.col) LIKE UPPER_UTF8('%кАкойТо Запрос%')
--таблица
CREATE TABLE "cashes" (
"id" INTEGER PRIMARY KEY NOT NULL,
"date" DATE NOT NULL,
"uid" INT(10) NOT NULL DEFAULT ('1'),
"visible" TINYINT(4) NOT NULL DEFAULT ('1')
);
--индекс
CREATE INDEX "XIF_CASHES_DUV" on cashes (date DESC, uid ASC, visible ASC);
--вызов плана
EXPLAIN QUERY PLAN SELECT
c.id, c.uid, c.date
FROM cashes c
WHERE
c.date BETWEEN '2013-04-01' AND '2013-06-01'
AND c.uid = 1 AND c.visible = 1
ORDER BY
c.date;
--план
SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_USR (uid=?) (~2 rows)
А дальше, как нужно было правильно создавать индекс. Поле даты - поле диапозона, должно было идти последним:
--индекс CREATE INDEX "XIF_CASHES_DUV" on cashes (uid ASC, visible ASC, date DESC); --план запроса SEARCH TABLE cashes AS c USING INDEX XIF_CASHES_DUV (uid=? AND visible=? AND date>? AND date<?) (~42 rows)Причем если бы мы искали точное соответствие по дате, то сработали бы оба индекса, но при поиске по диапазону только последний.