Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос на выборку, без учета регистра / 21 сообщений из 21, страница 1 из 1
27.05.2005, 10:02
    #33086703
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Я работаю с PHP и PostgreSQL
Делаю запрос
"SELECT * FROM tovari WHERE cd_name ~ '%".$searchfor."%' OR cd_rejisser ~ '%".$searchfor."%' OR cd_descr ~ '%".$searchfor."%' OR cd_actors ~ '%".$searchfor."%';";

При выполнении ничего не находит. Когда использую LIKE вместо ~ то находит, но регистр играет значение.
Подскажите, може как-то по-другому в PostgreSQL запросі сотсавляют?
...
Рейтинг: 0 / 0
27.05.2005, 10:42
    #33086828
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
twistfireSELECT * FROM tovari WHERE cd_name ~ '%".$searchfor."%' ....
Такая фигня действительно работать не будет. :)
Это ж конструкция для LIKE (LIKE '%foobar%').
Для регекспов - просто cd_name ~ 'blablabla'.
Зависимость от регистра устраняется примерно так : lower(cd_name) LIKE '%foobar%'
...
Рейтинг: 0 / 0
27.05.2005, 10:47
    #33086854
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Да, для регекспов поиск с игнорированием регистра : cd_name ~* 'mask'
...
Рейтинг: 0 / 0
27.05.2005, 14:17
    #33087586
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
не хочте делать ~* - поиск без учета регистра...
Может я что-то неверно делаю
Смотрите, какой в итоге запрос получается
SELECT * FROM tovari WHERE cd_name ~* '%".$searchfor."%' OR cd_rejisser ~* '%".$searchfor."%' OR cd_descr ~* '%".$searchfor."%' OR cd_actors ~* '%".$searchfor."%';"
...
Рейтинг: 0 / 0
27.05.2005, 14:23
    #33087613
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Выкинуть % из строки поиска!
...
Рейтинг: 0 / 0
27.05.2005, 14:32
    #33087648
Meta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
twistfireне хочте делать ~* - поиск без учета регистра...
Может я что-то неверно делаю
Смотрите, какой в итоге запрос получается
SELECT * FROM tovari WHERE cd_name ~* '%".$searchfor."%' OR cd_rejisser ~* '%".$searchfor."%' OR cd_descr ~* '%".$searchfor."%' OR cd_actors ~* '%".$searchfor."%';"

Если переменная $searchfor не является регулярным выражением, то используй конструкцию предложенную ХМ, а перед этим понизь регистр у строки $searchfor =)
А вообще, на больших таблицах конструкции column LIKE '%value%' тормозят жутко :)
...
Рейтинг: 0 / 0
27.05.2005, 15:32
    #33087832
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Но, мне же необходимо делать такой запрос...
У меня там записан тект неограниченной длины...
Если я уберу % то, как я понимаю, я не смогу найти вхождение переменной $searchfor в поле?
...
Рейтинг: 0 / 0
27.05.2005, 15:49
    #33087894
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Вы понимаете неправильно.
Тупая проверка: select 'abcde' ~* 'CD' = 'true'
Вы вообще-то с регекспами знакомы? :)
И совет - если уж запросы на поиск достаточно частые и данных много, рассмотрите испльзование полнотекстовго поиска, tsearch2 , например.
...
Рейтинг: 0 / 0
27.05.2005, 16:04
    #33087949
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
я начинаю понимать :) Что теперь вообще ничего не понимаю...

Опишу ситуацию снова.
Моя таблица - tovari
в ней несколько полей.
Провожу поиск по таким полям как cd_name, cd_rejisser, cd_descr, cd_actors

Как мне организовать запрос, чтобы удовлетворяло таким запросам
КРУЗ, крУз, ТОМ КРУЗ, тОм круз, если в поле cd_actors записано Том Круз.

Я просто не могу понять (не программист, а проблему решить надо).

Помогите с REgexp...
...
Рейтинг: 0 / 0
27.05.2005, 16:17
    #33087989
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Вот неужели тяжело открыть консоль psql и вбить
Код: plaintext
1.
2.
select 'Том Круз' ~* 'круз' ;
select * from tovari where cd_actors ~* 'том круз';
???
...
Рейтинг: 0 / 0
27.05.2005, 16:39
    #33088065
Meta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
twistfireя начинаю понимать :) Что теперь вообще ничего не понимаю...

Опишу ситуацию снова.
Моя таблица - tovari
в ней несколько полей.
Провожу поиск по таким полям как cd_name, cd_rejisser, cd_descr, cd_actors

Как мне организовать запрос, чтобы удовлетворяло таким запросам
КРУЗ, крУз, ТОМ КРУЗ, тОм круз, если в поле cd_actors записано Том Круз.

Я просто не могу понять (не программист, а проблему решить надо).

Помогите с REgexp...

Для подобных запросов можно и без регулярных выражений обойтись :)
Достаточно LIKE'а
Пример:
$searchStr = pg_escape_string(strtolower($searchfor));
$query = "SELECT * FROM tovari WHERE lower(cd_name) LIKE '%$searchStr%' ";
...
Рейтинг: 0 / 0
27.05.2005, 17:51
    #33088297
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
XMВот неужели тяжело открыть консоль psql и вбить
Код: plaintext
1.
2.
select 'Том Круз' ~* 'круз' ;
select * from tovari where cd_actors ~* 'том круз';
???

Я же обїяснил...
мне вообще ничего не доступно, как админу бд...
Я удаленно только через клиент PHP подключаюсь



А насчет, LIKE - попробую через 20 мин скажу..
...
Рейтинг: 0 / 0
27.05.2005, 17:59
    #33088322
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
код PHP

$searchfor=pg_escape_string(strtolower($searchfor));

запрос
SELECT * FROM tovari WHERE lower(cd_name) LIKE '%круз%' OR lower(cd_rejisser) LIKE '%круз%' OR lower(cd_descr) LIKE '%круз%' OR lower(cd_actors) LIKE '%круз%';

Ничего не найдено..
Хотя запись есть.
...
Рейтинг: 0 / 0
27.05.2005, 18:11
    #33088367
Meta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Тяжко :)
Берем табличку.

CREATE TABLE test.test123
(
name varchar(64) NOT NULL
)
WITH OIDS;

Загоняем туда следующие слова.
Круз
Круффф
КРУЗ
КукуКруз
КрузКуку

Запрос:
select * from test.test123 WHERE lower(name) like '%круз%'
Ответ:
Круз
КРУЗ
КукуКруз
КрузКуку

Всё отлично работает :)
Возможно проблема в кодировке
...
Рейтинг: 0 / 0
27.05.2005, 21:18
    #33088601
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Мне тоже тяжко :(

но я все делаю аналогично.
и не работает.
Может быть, проблема в кодировке.
Как исправить, эту "возможную" проблему?
...
Рейтинг: 0 / 0
28.05.2005, 09:18
    #33088734
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
Собственно, могут быть следующие проблемы:
1. Кодировка - проверить можно, выполнив запрос с указанием полностью поля, которое есть в базе.
Этот случай должно быть достаточно просто исправить.

2. Локаль базы - может не работать lower() - проверка: select lower('ПроВерКа'). Если к нижнему регистру не приводится, то скорее всего инициализация (initdb) базы проходила в локали C , и о игнорировании регистра русских букв можно забыть, не проведя переинициализацию базы.
...
Рейтинг: 0 / 0
28.05.2005, 13:05
    #33088815
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
А если бд будет переинициализир.? то все данные утеряны?
И как это сделать?
...
Рейтинг: 0 / 0
28.05.2005, 13:27
    #33088836
XM
XM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
twistfireА если бд будет переинициализир.? то все данные утеряны?
И как это сделать?
Ну, данные можно выгрузить перед переустановкой - через pg_dump, например, и потом обратно внести (в новую базу). Но если у Вас нет прав root, и PostgreSQL никогда не ставили, то никак. :(

В принципе, можно слегка извратиться и преобразовать строку поиска, например, так (для CP-1251):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
function tune_regexp($line){
 $chars = preg_split('//',$line);
 $out = '';
 foreach($chars as $char){
   $k=ord($char);
   if($k>=ord('А') && $k<=ord('Я') ){
        $out .= '[' . $char . chr($k+ 32 ) . ']';
   }elseif($k>=ord('а') && $k<=ord('я') ){
        $out .= '[' . $char . chr($k- 32 ) . ']';
   }elseif($k>=ord('Z') && $k<=ord('Z') ){
        $out .= '[' . $char . chr($k+ 32 ) . ']';
   }elseif($k>=ord('a') && $k<=ord('z') ){
        $out .= '[' . $char . chr($k- 32 ) . ']';
   }elseif($k>=ord('0') && $k<=ord('9') || $k== 32 ){
        $out .= $char;
   } // а все остальные символы - в игнор :)
 }
 // режем нахрен лишние пробелы
 $out = preg_replace('/\s+/',' ', $out);
 $out = preg_replace('/^\s/', '', $out);
 $out = preg_replace('/\s$/', '', $out);
 return $out;
}
Использовать примерно так:
Код: plaintext
1.
2.
$searchfor = tune_regexp($searchfor);
$select_stmt = "SELECT * FROM tovari WHERE cd_name ~ '$searchfor'";
...
Рейтинг: 0 / 0
28.05.2005, 21:20
    #33089177
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
а, если не секрет, что эта функция делает?
изменяет символы??
...
Рейтинг: 0 / 0
28.05.2005, 21:36
    #33089180
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
УРА!!!!


ВСЕ СУПЕР РАБОТАЕТ.
СПАСИБО огромное.
ЧЕМ СМОГУ - ТЕМ ПОМОГУ.
СПАСИБО.
...
Рейтинг: 0 / 0
29.05.2005, 09:38
    #33089295
twistfire
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос на выборку, без учета регистра
все понял как работает.
Сам бы написал, если б знал, как надо переставалять...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос на выборку, без учета регистра / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]