Вверх ↑
Этот топик читают: Гость
Ответов: 139
Рейтинг: 0
#16: 2009-04-29 00:32:18 ЛС | профиль | цитата
У меня такое ощущение, что символ "%" значим только с LIKE.
В твоём выражении - что с ним, что без него одно и тоже, ведь мы сравниваем 1 букву.

Скорее на худой конец придется второй аргумент substr в цикл брать:

#sql
SELECT * FROM event WHERE
(substr(name, 1,1)='Ф' OR substr(name, 1,1)='ф')
and (substr(name, 2,1)='О' OR substr(name, 2,1)='о')
and (substr(name, 3,1)='М' OR substr(name, 3,1)='м')

...и так далее, чтоб Фоминых отсеять.
А если мне не сначала слова надо фрагмент найти ? :shock:

...как выход - идея хорошая. Спасибо.
А куда tsdima подевался то?

Вот щяс твой второй код заметил - там принципиально проверяется вхождение ТОЛЬКО ОДНОЙ ПЕРВОЙ буквы в набор. Да к тому же с регистром не все возможные варианты перебираются - а перебрать все - это треснуть можно...
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#17: 2009-04-29 01:39:32 ЛС | профиль | цитата
Danya писал(а):
Вот щяс твой второй код заметил - там принципиально проверяется вхождение ТОЛЬКО ОДНОЙ ПЕРВОЙ буквы в набор. Да к тому же с регистром не все возможные варианты перебираются - а перебрать все - это треснуть можно...

Где ты увидел такое.
Во втором варианте с регистром как раз все варианты перебираются.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1891
Рейтинг: 110
#18: 2009-04-29 03:38:41 ЛС | профиль | цитата
Danya, писал(а):
А вот как бы Upper победить


Могу дать сборку библиотек для работы с базами данных SQLite c поддержкой upper и lower и возможностью регистронезависимого поиска по тексту.
Минусы:
данные необходимо в базу писать в формате utf-8
ну и размерчик библиотек приличный

Если на минусы пофиг, то можно вполне успешно использовать
карма: 0
%time%
0
Ответов: 2125
Рейтинг: 159
#19: 2009-04-29 14:35:44 ЛС | профиль | цитата
По поводу upper: очевидно результат как-то криво обратно передаётся. Всё, что могу посоветовать: сделать строковую переменную глобальной. Вот так:

var s:string;
procedure myFunc(ctx:pointer; nArg:integer; args:ppvalue); cdecl;
begin
s:=sqlite3_value_text(args^);
CharUpperBuff(@s[1],Length(s));
sqlite3_result_text(ctx,PChar(s),Length(s),0);
end;
карма: 1

1
Голосовали:Tad
Разработчик
Ответов: 26163
Рейтинг: 2127
#20: 2009-04-29 15:31:52 ЛС | профиль | цитата
tsdima, у функции CharUpperBuff есть один неприятный момент, она в любом случае рушит строковую переменную, те, не делает копий
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#21: 2009-04-29 18:42:36 ЛС | профиль | цитата
Danya, ну вот, а ты боялся. Скажи дяде спасибо.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 2125
Рейтинг: 159
#22: 2009-04-29 19:50:04 ЛС | профиль | цитата
nesco писал(а):
те, не делает копий

Проблема в том, что PChar, переданный в sqlite3_result_text, сохраняется где-то (это-ж указатель), а после выхода из myFunc этот PChar уничтожается. Однако указатель этот используется SQLite-ом сразу после вызова нашей функции, т.е. заботиться о сохранении данных до следующего вызова нашей функции не надо.
карма: 1

0
Ответов: 139
Рейтинг: 0
#23: 2009-04-29 20:27:50 ЛС | профиль | цитата
Уррррррра! работает!!!
Ребятушки, спасибо. На всякий случай для потомков выкладываю рабочий компонент функции целиком.

code_13077.txt
карма: 0

0
файлы: 1code_13077.txt [1.7KB] [134]
Гость
Ответов: 17029
Рейтинг: 0
#24: 2009-04-29 21:37:37 правка | ЛС | профиль | цитата

карма: 0

0
Ответов: 16884
Рейтинг: 1239
#25: 2009-04-29 21:38:16 ЛС | профиль | цитата
Выше это я.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
25
Сообщение
...
Прикрепленные файлы
(файлы не залиты)