powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиска элемента в массиве по значению
3 сообщений из 3, страница 1 из 1
Поиска элемента в массиве по значению
    #35678950
shuler239
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброе время суток.

Встала задача получить позицию вхождения слова в строку.
Т.е. в строке "car dog" для слова "Dog" надо получить "1", для слова "cAr" - "0", для слова "vendor" - "-1".

Первое, что мне пришло в голову - разбить строку в массив по пробелам.
Примерно так:
Код: plaintext
1.
regexp_split_to_array(string, E'\\s+')

И вот теперь я уже сталкиваюсь с проблемой, что не знаю как получить индекс элемента в массиве по его значению.
Поиском по ветке посмотрел - ничего более-менее подходящего не нашел.

Ворос вот в чем.
1) Правльно ли мое решение по переходу от строки к массиву?
2) Если да, то мне придется написать свою функцию, которая будет перебирать элементы массива, пока не найдет элемент?
...
Рейтинг: 0 / 0
Поиска элемента в массиве по значению
    #35681086
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shuler2391) Правльно ли мое решение по переходу от строки к массиву?в дополнение к имеющейся таблице lines(id,data) добавить таблицу words(line_id,ordr,data) и делать select ordr from words where line_id=? and data=?.

lines
1 мама мыла раму
2 foo bar baz

words
1 1 мама
1 2 мыла
1 3 раму
2 1 foo
2 2 bar
2 3 baz
...
Рейтинг: 0 / 0
Поиска элемента в массиве по значению
    #35682866
shuler239
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBat,

Ну это решение мне не совсем нравится, поскольку это затрудняет добавление/обновление записей.

Я все-таки решил отказаться от массивов, и написал свою функцию определения позиции слова в строке.
Почему функцию? Потому что эту позицию я учитываю как показатель ранжирования в сложно запросе, и решение, предложенное Вами, тут опять же неоптимально...

Собственно, код функции:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE FUNCTION wordPos ( varchar, varchar ) RETURNS integer AS $$
DECLARE
  int_haystack ALIAS FOR $ 1 ;
  int_needle ALIAS FOR $ 2 ; 
  haystack varchar;
  needle varchar;
  pos integer; 
BEGIN
	pos =  0 ;
	needle	 = lower( int_needle );
	haystack = lower( int_haystack );
	IF strpos(haystack, needle) >  0  THEN
			haystack = lower( ( regexp_replace(haystack, '[[:space:]]+', ' ', 'g' ) ) );
			haystack = regexp_replace( haystack, '^[[:space:]]+', '', 'g');			

            pos = length( regexp_replace( substr( haystack,  1 , POSITION( needle IN haystack ) -  1  ), '[[:space:]]+',' ', 'g' )) 
                - length( regexp_replace( substr( haystack,  1 , POSITION( needle IN haystack ) -  1  ), '[[:space:]]+','', 'g' ));
			pos = pos +  1 ;
            
    END IF;
    RETURN pos;  
END;
$$ LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Поиска элемента в массиве по значению
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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