powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запрос на выборку, без учета регистра
21 сообщений из 21, страница 1 из 1
запрос на выборку, без учета регистра
    #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
запрос на выборку, без учета регистра
    #33086828
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
twistfireSELECT * FROM tovari WHERE cd_name ~ '%".$searchfor."%' ....
Такая фигня действительно работать не будет. :)
Это ж конструкция для LIKE (LIKE '%foobar%').
Для регекспов - просто cd_name ~ 'blablabla'.
Зависимость от регистра устраняется примерно так : lower(cd_name) LIKE '%foobar%'
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33086854
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, для регекспов поиск с игнорированием регистра : cd_name ~* 'mask'
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33087586
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не хочте делать ~* - поиск без учета регистра...
Может я что-то неверно делаю
Смотрите, какой в итоге запрос получается
SELECT * FROM tovari WHERE cd_name ~* '%".$searchfor."%' OR cd_rejisser ~* '%".$searchfor."%' OR cd_descr ~* '%".$searchfor."%' OR cd_actors ~* '%".$searchfor."%';"
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33087613
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкинуть % из строки поиска!
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #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
запрос на выборку, без учета регистра
    #33087832
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но, мне же необходимо делать такой запрос...
У меня там записан тект неограниченной длины...
Если я уберу % то, как я понимаю, я не смогу найти вхождение переменной $searchfor в поле?
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33087894
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы понимаете неправильно.
Тупая проверка: select 'abcde' ~* 'CD' = 'true'
Вы вообще-то с регекспами знакомы? :)
И совет - если уж запросы на поиск достаточно частые и данных много, рассмотрите испльзование полнотекстовго поиска, tsearch2 , например.
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33087949
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я начинаю понимать :) Что теперь вообще ничего не понимаю...

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

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

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

Помогите с REgexp...
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33087989
Фотография XM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот неужели тяжело открыть консоль psql и вбить
Код: plaintext
1.
2.
select 'Том Круз' ~* 'круз' ;
select * from tovari where cd_actors ~* 'том круз';
???
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #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
запрос на выборку, без учета регистра
    #33088297
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMВот неужели тяжело открыть консоль psql и вбить
Код: plaintext
1.
2.
select 'Том Круз' ~* 'круз' ;
select * from tovari where cd_actors ~* 'том круз';
???

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



А насчет, LIKE - попробую через 20 мин скажу..
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #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
запрос на выборку, без учета регистра
    #33088367
Meta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тяжко :)
Берем табличку.

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

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

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

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

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

2. Локаль базы - может не работать lower() - проверка: select lower('ПроВерКа'). Если к нижнему регистру не приводится, то скорее всего инициализация (initdb) базы проходила в локали C , и о игнорировании регистра русских букв можно забыть, не проведя переинициализацию базы.
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33088815
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если бд будет переинициализир.? то все данные утеряны?
И как это сделать?
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33088836
Фотография 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
запрос на выборку, без учета регистра
    #33089177
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, если не секрет, что эта функция делает?
изменяет символы??
...
Рейтинг: 0 / 0
запрос на выборку, без учета регистра
    #33089180
twistfire
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
УРА!!!!


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


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