Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск по тексту / 7 сообщений из 7, страница 1 из 1
29.06.2008, 14:31
    #35400841
elDraco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
Собственно была сделана такая ХП, если делаю без execute то всё нормально, но ХП задумывалась как универсальная
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TYPE resDictItem AS (iName varchar( 100 ), iID integer);
CREATE OR REPLACE FUNCTION loadDict(tblname varchar( 50 ), cPID integer, pattern_string text) returns SETOF resDictItem as $func$
DECLARE
	txt_array text[];
	tmp_pattern_string text;
	tmp_str resDictItem;
BEGIN
	tmp_pattern_string = regexp_replace(pattern_string, E'(\\x20)+', ';', 'g');
	txt_array = string_to_array(tmp_pattern_string, ';');
	for tmp_str in execute 'select name as iName, id as iID from ' || quote_ident(tblname) || ' where pid = ' || cPID || ' and name ~* all(' || txt_array || ')'
	loop
		return next tmp_str;
	end loop;
	return;
END
$func$ language plpgsql;
таблица создаётся тоже ХП:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create or replace function createList(tblname varchar( 50 )) returns void as $func$
begin
	execute 'create table ' || quote_ident(tblname) || '( '
				|| 'id integer NOT NULL, '
				|| 'pid integer NOT NULL, '
				|| 'name varchar(100) NOT NULL, '
				|| 'PRIMARY KEY (id, pid))';
end
$func$ language plpgsql;

настоящий полнотекстовый поиск не нужен, но если производительность не пострадает (кто что скажет?)
проблема в том что при исполнении вылезает ошибка "оператор не уникален: text[] || unknown" и тычет на txt_array в execute... ктонить знает как бороться? или чем подобную конструкцию заменить?
нужно для подгрузки вариантов выбора в combobox в java приложении
...
Рейтинг: 0 / 0
30.06.2008, 13:22
    #35401891
YuriyRusinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
в postgres'е есть функция типа array_to_string.
...
Рейтинг: 0 / 0
30.06.2008, 16:58
    #35402371
elDraco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
собственно all() принимает как раз массив, поэтому string_to_array и использовался... смысл делать обратную операцию?

более точный вопрос как строку вида 'str1^str2^...^strN', где strI - лексемы, а ^ разделители преобразовать или в строку отражающую массив (чтоб можно было подставить в execute) или в subquery возвращающую одну колонку?

задача найти все строки содержащие в себе одновременно все лексемы в произвольном порядке, возможно с наложением даже
...
Рейтинг: 0 / 0
30.06.2008, 17:54
    #35402492
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
Код: plaintext
1.
2.
tmp_pattern_string = regexp_replace(pattern_string, E'(\\x20)+', ',', 'g');
for tmp_str in execute 'select name as iName, id as iID from ' || quote_ident(tblname) || ' where pid = ' || cPID || ' and name ~* all(' || quote_literal('{' || tmp_pattern_string || '}') || '::text[])'

--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
30.06.2008, 18:03
    #35402501
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
если у Вас кодировка базы/кластера utf-8 то регистронезависимо это будет работать только для латиницы (регулярные выражения не правильно работают с мультибайтными строками)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
01.07.2008, 14:54
    #35404319
elDraco
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
Ёш, огромное спасибо! именно то что мне было нужно, а насчёт регистронезависимости всегда есть обходной путь, спасибо, что указали на эту особенность:)
финальный вариант ХП:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TYPE resDictItem AS (iName varchar( 100 ), iID integer);
CREATE OR REPLACE FUNCTION loadDict(tblname varchar( 50 ), cPID integer, pattern_string text) returns SETOF resDictItem as $func$
DECLARE
	txt_array text[];
	tmp_pattern_string text;
	tmp_str resDictItem;
BEGIN
	tmp_pattern_string = regexp_replace(pattern_string, E'([\\%\\\\_\\.\\(\\)\\[\\]\\?\\\'])+', '', 'g');--просто на всякий случай
	tmp_pattern_string = regexp_replace(tmp_pattern_string, E'(\\x20)+', ',', 'g');--склейка пробелов
	tmp_pattern_string = regexp_replace(tmp_pattern_string, E'(^,|,$)', '', 'g');--мало ли пробел в начале или конце воткнут
	tmp_pattern_string = lower(tmp_pattern_string);--обход регистров
	for tmp_str in execute 'select name as iName, id as iID from ' || quote_ident(tblname) || ' where pid = ' || cPID || ' and lower(name) ~* all(' || quote_literal('{' || tmp_pattern_string || '}') || '::text[])'
	loop
		return next tmp_str;
	end loop;
	return;
END
$func$ language plpgsql;
...
Рейтинг: 0 / 0
04.07.2008, 10:51
    #35410907
ss25
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поиск по тексту
Код: plaintext
--мало ли пробел в начале или конце воткнут

trim()
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиск по тексту / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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