Topic: Поиск по двум и более полям одновременно в запросе

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

Re: Поиск по двум и более полям одновременно в запросе

Привет,
Обычный способ поиска по нескольким полям состоит в том, чтобы использовать рассчитанное поле для объединения столько полей, сколько вы хотите.
Посмотрите, как определяется поле «cfsearch» в схеме данных в прилагаемом примере.
Переместите мышь в нижнюю часть экрана, чтобы отобразить параметры.
С уважением,
Derek.

Post's attachments

Attachment icon multi field search.zip 460.47 kb, 68 downloads since 2025-08-03 

Re: Поиск по двум и более полям одновременно в запросе

derek wrote:

Привет,
Обычный способ поиска по нескольким полям состоит в том, чтобы использовать рассчитанное поле для объединения столько полей, сколько вы хотите.
Посмотрите, как определяется поле «cfsearch» в схеме данных в прилагаемом примере.
Переместите мышь в нижнюю часть экрана, чтобы отобразить параметры.
С уважением,
Derek.

Не это не то, я делаю поиск через sql-запрос вот такого типа:

SELECT
lastname
,firstname
,secondname
,id

FROM
base                                                                   

WHERE
lastname LIKE '%{edSearch}%' OR  
firstname LIKE '%{edSearch}%' OR 
secondname LIKE '%{edSearch}%'

и нужно чтобы находило по всем полям при вводе одновременно имя, фамилии и отчества

Re: Поиск по двум и более полям одновременно в запросе

Не знаю, зачем вам такие сложности, но можно сделать так:


Пользователь набирает текст в строке поиска. На событие OnChange навешивается скрипт, который парсит набранный текст и определяет, что там набрано: 1) фамилия, 2) фамилия и имя 3) фамилия, имя и отчество. И разносит это в три строковые переменные, из которых собирается нужный SQL-запрос - по кусочку в каждое поле таблички.
Правила парсинга (как я понял из вашего описания) - пробелом разделяются куски текста, чтобы понять, где что находится. Можно использовать SplitString() - эта функция разделяет текст на строковый массив. Подготовленный SQL нужно поместить в свойство dbSQL (кнопки или таблицы - как вам удобней) и обновить данные ( вызвать метод Click или dbUpdate).


Можно навесить обработчик OnClick на кнопку и там все делать, а поле ввода текста фильтра связать с кнопкой свойством Increm.Search

Визуальное программирование: блог и телеграм-канал.

Re: Поиск по двум и более полям одновременно в запросе

k245 wrote:

Не знаю, зачем вам такие сложности, но можно сделать так:


Пользователь набирает текст в строке поиска. На событие OnChange навешивается скрипт, который парсит набранный текст и определяет, что там набрано: 1) фамилия, 2) фамилия и имя 3) фамилия, имя и отчество. И разносит это в три строковые переменные, из которых собирается нужный SQL-запрос - по кусочку в каждое поле таблички.
Правила парсинга (как я понял из вашего описания) - пробелом разделяются куски текста, чтобы понять, где что находится. Можно использовать SplitString() - эта функция разделяет текст на строковый массив. Подготовленный SQL нужно поместить в свойство dbSQL (кнопки или таблицы - как вам удобней) и обновить данные ( вызвать метод Click или dbUpdate).


Можно навесить обработчик OnClick на кнопку и там все делать, а поле ввода текста фильтра связать с кнопкой свойством Increm.Search

я в action на кнопку поиска вешаю запрос выше и пытаюсь сложить два поля почему это не работает?

SELECT
lastname
,firstname
,secondname
,id

FROM
base                                                                   

WHERE
lastname + ' ' + firstname LIKE '%{edSearch}%' OR  
firstname LIKE '%{edSearch}%' OR 
secondname LIKE '%{edSearch}%'

Re: Поиск по двум и более полям одновременно в запросе

Привет Finlimakki, Konstantin,
Возможно, я не понимаю вашу проблему, но всё же думаю, что можно просто использовать «вычисляемое поле» вместо «SQL-запроса».
В приложении (аналогично предыдущему) вы можете использовать «вычисляемое поле» для поиска по имени и/или фамилии и/или отчеству.
По всем трём параметрам можно выполнять поиск полностью или частично и в любой последовательности. Просто вводите «пробел» между любыми элементами поиска.
Не понимаю, чего ещё вы пытаетесь добиться.
Derek.

Post's attachments

Attachment icon multi field search.zip 442.82 kb, 69 downloads since 2025-08-05 

Re: Поиск по двум и более полям одновременно в запросе

finlimakki wrote:

я в action на кнопку поиска вешаю запрос выше и пытаюсь сложить два поля почему это не работает?

SELECT
lastname
,firstname
,secondname
,id

FROM
base                                                                   

WHERE
lastname + ' ' + firstname LIKE '%{edSearch}%' OR  
firstname LIKE '%{edSearch}%' OR 
secondname LIKE '%{edSearch}%'

Ваш запрос работает, но не для частичного совпадения (вхождения), а для полного совпадения набранного текста с фамилией и именем. Если нужен поиск по вхождению, сделайте так, как я написал выше.

Визуальное программирование: блог и телеграм-канал.

Re: Поиск по двум и более полям одновременно в запросе

derek wrote:

Привет Finlimakki, Konstantin,
Возможно, я не понимаю вашу проблему, но всё же думаю, что можно просто использовать «вычисляемое поле» вместо «SQL-запроса».
В приложении (аналогично предыдущему) вы можете использовать «вычисляемое поле» для поиска по имени и/или фамилии и/или отчеству.
По всем трём параметрам можно выполнять поиск полностью или частично и в любой последовательности. Просто вводите «пробел» между любыми элементами поиска.
Не понимаю, чего ещё вы пытаетесь добиться.
Derek.

Finlimakki хочет искать по вхождению по трём полям, одновременно, но при этом использовать одно поле ввода, в которое будет вводить через пробел куски для поиска в каждом поле.


В русском языке есть такая поговорка: охота хуже неволи. smile

Визуальное программирование: блог и телеграм-канал.

9 (edited by sparrow 2025-08-06 10:52:19)

Re: Поиск по двум и более полям одновременно в запросе

Derek already provided such a solution in the last example, searching for any combination of each field and any place in it. It can only be simplified a little.



Дерек уже предоставил такое решение в последнем примере, поиск по любой комбинации из каждого поля и любого места в нем. Можно только чуть упростить его.
А запрос finlimakki нерабочий.

Re: Поиск по двум и более полям одновременно в запросе

I used this statement in a "SQL query" button


SELECT DISTINCT
    Items.id AS ID,
    CASE WHEN finalizado = 1 THEN '✔' ELSE ' ' END AS Ok,
    Items.nome_item AS Item,
    ItemsTree.Name AS Tree
FROM Items
INNER JOIN ItemsTree ON Items.id_ItemsTree = ItemsTree.id
LEFT OUTER JOIN tbl_table ON Items.id = tbl_table.id_Items
LEFT OUTER JOIN tbl_campos ON tbl_table.id = tbl_campos.id_tbl_table
LEFT OUTER JOIN tbl_fld_tipos ON tbl_fld_tipos.id = tbl_campos.id_tbl_fld_tipos
WHERE
    IFNULL(Items.nome_item, '') ||
    IFNULL(ItemsTree.Name, '') ||
    IFNULL(Items.notas, '') ||
    IFNULL(Items.texto_rtf, '') ||
    IFNULL(tbl_table.nome_tabela, '') ||
    IFNULL(tbl_table.descricao, '') ||
    IFNULL(tbl_table.notas, '') ||
    IFNULL(tbl_campos.name, '') ||
    IFNULL(tbl_fld_tipos.Name, '') ||
    IFNULL(tbl_campos.descricao, '') ||
    IFNULL(tbl_campos.notas, '')
LIKE "%{Edit_busca}%"
Roberto Alencar

Re: Поиск по двум и более полям одновременно в запросе

Решил вот так возможно кому-нибудь пригодится такой вариант поиска:

SELECT
lastname
,firstname
,secondname                   
,id     
          
FROM            
base

WHERE                  
ifnull(lastname||' ','') ||   
ifnull(firstname||' ','') ||
ifnull(secondname||' ','')
LIKE "%{edSearch}%" 

Всем спасибо!;)