Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 25

Не работает функция по нечеткому поиску ФИО

28.02.2018, 21:15. Показов 1290. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый вечер, столкнулся с такой проблемой: у меня есть функция, которая на вход принимает ФИО, далее, в первый запрос я подставляю параметр ФИО и нахожу все ID людей, ФИО которых схоже с введенным параметром.

1-ый запрос:
SQL
1
2
3
SELECT ID, maindb.TrigramFullName(employeesuniversity) <-> FullNames AS dist INTO IDSearch
FROM maindb.employeesuniversity
ORDER BY dist ASC;
Затем записываю найденные ID в переменную. Но потом, когда во втором запросе я хочу вывести всех людей, ID которых были сохранены в переменную, то оказывается, что в переменной записано только первое ID, а остальные - нет (при том я знаю, что ID должно быть больше одного).

2-ой запрос:
SQL
1
2
3
4
5
6
7
8
9
10
SELECT  e.ID, (FullName).FirstName, (FullName).SecondName, (FullName).Patronymic,e.DateOfBirth, e.MobilePhoneNumber, e.CityPhoneNumber, 
COALESCE(ss.DeptName,s.DeptName) AS Dept,CASE WHEN ss.DeptName IS NULL THEN NULL ELSE s.DeptName END AS Pkod
FROM maindb.EmployeesUniversity AS e
INNER JOIN maindb.ListPositionSubdivision AS ls
ON e.ID = ls.IDEmployees
INNER JOIN maindb.StructuralSubdivision AS s
ON ls.NameSubdivision = s.DeptKod
LEFT JOIN maindb.StructuralSubdivision AS ss
ON ss.DeptKod = s.PKod
WHERE ls.EndDatePosition IS NULL AND e.ID = IDSearch;
Как это можно исправить так, чтобы во втором запросе выводились все найденные ID первого запроса?
А вот как выглядит вся функция:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE OR REPLACE FUNCTION maindb.SearchFullName(FullNames VARCHAR)
  RETURNS TABLE (IDEmployees INT, FName VARCHAR, SName VARCHAR, Patronymic VARCHAR, DateBirth DATE, MobilePhone maindb.domainmobilephonenumber, CityPhone maindb.domaincityphonenumber, Dept VARCHAR, Pkod VARCHAR) AS
$BODY$
 
DECLARE
    IDSearch INT;
BEGIN 
 
SELECT ID, maindb.TrigramFullName(employeesuniversity) <-> FullNames AS dist INTO IDSearch
FROM maindb.employeesuniversity
ORDER BY dist ASC;
 
 RETURN QUERY 
 SELECT  e.ID, (FullName).FirstName, (FullName).SecondName, (FullName).Patronymic,e.DateOfBirth, e.MobilePhoneNumber, e.CityPhoneNumber, 
 COALESCE(ss.DeptName,s.DeptName) AS Dept,CASE WHEN ss.DeptName IS NULL THEN NULL ELSE s.DeptName END AS Pkod
 
 FROM maindb.EmployeesUniversity AS e
 INNER JOIN maindb.ListPositionSubdivision AS ls
 ON e.ID = ls.IDEmployees
 INNER JOIN maindb.StructuralSubdivision AS s
 ON ls.NameSubdivision = s.DeptKod
 LEFT JOIN maindb.StructuralSubdivision AS ss
 ON ss.DeptKod = s.PKod
 WHERE ls.EndDatePosition IS NULL AND e.ID = IDSearch;
 
END ;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100
  ROWS 1000;
ALTER FUNCTION maindb.SearchFullName(FullNames VARCHAR)
  OWNER TO admin;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.02.2018, 21:15
Ответы с готовыми решениями:

Функция по поиску элемента
всем доброго времени суток ))) господа программисты помогите написать функцию const int* find(const int&amp; val, const int* begin,...

Функция по поиску минимального значения параболы
Ребята помогите пожалуйста, напрочь забыл школьный курс матемитики. Мне необходимо сделать функцию для нахождения такого x, при...

Не вызывается функция по поиску цифр из заданной строки
Никак не могу найти,где ошибка! Вроде все работает, а вот функция по поиску цифр из заданной строки не вызывается.. ...

3
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
01.03.2018, 00:02
Цитата Сообщение от djserg125 Посмотреть сообщение
maindb.TrigramFullName(employeesuniversi ty) <-> FullNames
Не ясно логика этого выражения. Что вы вообще проверяете/получаете этим запросом??
Если следовать логике операторов полнотекстового поиска, то в результате здесь должен быть текст запроса, которым потом можно что-то поискать. В INTO вы его не запоминаете, в чем смысл??
Теперь сам INTO, если записей возвращается больше одной, то запоминается только первая (хотя принципиально это ошибка и другие СУБД ругаются на это).
Самый верный вариант, разобраться с полнотекстовым поиском и поставить правильную проверку в общий запрос. FullNames превратить в tsquery, а то что лежит в таблицах, превратить в tsvector, тогда можно попробовать применить оператор полнотекстового поиска @@
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 25
01.03.2018, 00:21  [ТС]
Изначально я создаю такую функцию которая на вход принимает таблицу

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE FUNCTION maindb.TrigramFullName(p maindb.employeesuniversity)
RETURNS TEXT
LANGUAGE plpgsql
IMMUTABLE
AS $$
BEGIN
 
RETURN LOWER(TRIM(COALESCE((p.FullName).FirstName,'') || ' ' ||COALESCE((p.FullName).SecondName,'') || ' ' ||COALESCE((p.FullName).Patronymic,'')));
 
EXCEPTION WHEN others THEN RAISE EXCEPTION '%', sqlerrm;
END;
$$;
ALTER FUNCTION maindb.TrigramFullName(p maindb.employeesuniversity)
  OWNER TO admin;
После этого создаю индекс на таблицу с ФИО
SQL
1
2
CREATE INDEX info_gist_idx ON maindb.employeesuniversity
USING gist(maindb.TrigramFullName(employeesuniversity) gist_trgm_ops);
И уже после этого выполняю этот запрос где FullNames это ФИО введенное пользователем
SQL
1
2
3
SELECT ID, maindb.TrigramFullName(employeesuniversity) <-> FullNames AS dist INTO IDSearch
FROM maindb.employeesuniversity
ORDER BY dist ASC;
Добавлено через 8 минут
Хотя только что попробовал вот такой запрос работает как надо вроде

SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT  e.ID, maindb.TrigramFullName(e) <-> 'Иванов Иван' AS dist,
(FullName).FirstName, (FullName).SecondName, (FullName).Patronymic,e.DateOfBirth, e.MobilePhoneNumber, e.CityPhoneNumber, 
COALESCE(ss.DeptName,s.DeptName) AS Dept,CASE WHEN ss.DeptName IS NULL THEN NULL ELSE s.DeptName END AS Pkod
FROM maindb.EmployeesUniversity AS e
INNER JOIN maindb.ListPositionSubdivision AS ls
ON e.ID = ls.IDEmployees
INNER JOIN maindb.StructuralSubdivision AS s
ON ls.NameSubdivision = s.DeptKod
LEFT JOIN maindb.StructuralSubdivision AS ss
ON ss.DeptKod = s.PKod
WHERE ls.EndDatePosition IS NULL
ORDER BY dist ASC;
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
01.03.2018, 02:16
У вас, что переопределен оператор '<->' ???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.03.2018, 02:16
Помогаю со студенческими работами здесь

Программа по поиску наименьшего по модулю элемента матрицы не работает корректно
Задание: Составить алгоритм обработки матрицы А типа short размером М х N (М≤10 строк, N≤10 столбцов). Значения М и N ввести с...

Функция, показывающая есть ли в группе девушки с одинаковым полем ФИО
1) функция, показывающая есть ли в группе девушки с одинаковым полем ФИО т.е. да/нет 2) функция, возвращающая номер самого старшего...

Функция, которая спрашивает у пользователя ФИО студента из группы и выдает данные о нем
Привет. Задание такое: Напишите функцию, которая спрашивает у пользователя ФИО студента из группы (список группы уже составлен заранее...

Сравнение данных ФИО и выдача сообщения, что данные ФИО не найдены
Помогите реализовать сложную для меня задачу. Есть две таблицы с ФИО: Табл1 в dbd и Табл.2 в SQL. Нужно сравнить все фамилии в Табл.1 с...

Из файла .txt данные = ФИО и з\п, как вытащить ФИО с з\п менее 20 тыс
Помогите плиз решить задачу. В файле .txt данные с фио и зарплатой. Надо чтобы пайтон напечатал только те ФИО, где зп менее 20 тысяч.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru