Topic: Поиск SQL запросом.

Весь поиск реализую SQL запросами. На данный момент на формах присутствует поиск по параметрам : текст, дата, выпадающий список.
Суть проблемы: поиск реализован двумя разными запросами, один отвечает за текст, другой за дату и выпадающий список. Хочу объединить всё в один запрос для того чтобы поиск производился по всем этим параметрам одновременно, не получается мало знаний в sql.

Код поиска текста:

SELECT
zurnal_cpu.id,
info_stanka.invent_nomer,
info_stanka.vnutr_nazv_cpu,
strftime('%d.%m.%Y', zurnal_cpu.data),
strftime('%H:%M', zurnal_cpu.vremia_ostanovki),
strftime('%H:%M', zurnal_cpu.vremia_sdaci),
zurnal_cpu.pricina_ostanovki,
zurnal_cpu.code_error,
zurnal_cpu.tekst_oshibki,
zurnal_cpu.vipolnenie_raboti                                                                                

FROM
zurnal_cpu 
LEFT OUTER JOIN info_stanka ON info_stanka.id=zurnal_cpu.id_info_stanka


WHERE
(CASE WHEN '{poisk}' <> '' THEN info_stanka.invent_nomer LIKE '%{poisk}%'  ELSE 1=1 END) OR
(CASE WHEN '{poisk}' <> '' THEN info_stanka.vnutr_nazv_cpu LIKE '%{poisk}%'  ELSE 1=1 END) OR
(CASE WHEN '{poisk}' <> '' THEN zurnal_cpu.pricina_ostanovki LIKE '%{poisk}%'  ELSE 1=1 END) OR
(CASE WHEN '{poisk}' <> '' THEN zurnal_cpu.code_error LIKE '%{poisk}%'  ELSE 1=1 END) OR
(CASE WHEN '{poisk}' <> '' THEN zurnal_cpu.tekst_oshibki LIKE '%{poisk}%'  ELSE 1=1 END) OR
(CASE WHEN '{poisk}' <> '' THEN zurnal_cpu.vipolnenie_raboti LIKE '%{poisk}%'  ELSE 1=1 END)

ORDER BY zurnal_cpu.id DESC  

Код поиска по дате и выпадающему списку:

SELECT
zurnal_cpu.id,
info_stanka.invent_nomer,
info_stanka.vnutr_nazv_cpu,
strftime('%d.%m.%Y', zurnal_cpu.data),
strftime('%H:%M', zurnal_cpu.vremia_ostanovki),
strftime('%H:%M', zurnal_cpu.vremia_sdaci),
zurnal_cpu.pricina_ostanovki,
zurnal_cpu.code_error,
zurnal_cpu.tekst_oshibki,
zurnal_cpu.vipolnenie_raboti,
smeni.smeni 
                              
FROM
zurnal_cpu 
LEFT OUTER JOIN info_stanka ON info_stanka.id=zurnal_cpu.id_info_stanka
LEFT OUTER JOIN smeni ON smeni.id=zurnal_cpu.id_smeni

WHERE
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(zurnal_cpu.data) = date({DateTimePicker1}) ELSE 1=1 END) And
(CASE WHEN {ComboBox1} <> -1 THEN zurnal_cpu.id_smeni = {ComboBox1} ELSE 1=1 END)
 
 ORDER BY zurnal_cpu.id DESC

Re: Поиск SQL запросом.

Посмотрите пожалуйста данный проект с примером
http://myvisualdatabase.com/forum/misc. … download=1

Dmitry.

Re: Поиск SQL запросом.

(CASE WHEN '{poisk}' <> '' THEN info_stanka.invent_nomer LIKE '%{poisk}%'  ELSE 1=1 END) AND
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(zurnal_cpu.data) = date({DateTimePicker1}) ELSE 1=1 END) AND
(CASE WHEN {ComboBox1} <> -1 THEN zurnal_cpu.id_smeni = {ComboBox1} ELSE 1=1 END)

данный вариант работает при поиске текста только в таблице info_stanka.invent_nomer как быть если нужно искать в нескольких таблицах, не могу никак в синтаксис въехать, извините smile?

Re: Поиск SQL запросом.

Приложите пожалуйста ваш проект, постараюсь сделать.

Dmitry.

Re: Поиск SQL запросом.

Спасибо, я разобрался. Работающим вариантом для моей задачи будет:

SELECT
zurnal_cpu.id,
info_stanka.invent_nomer,
info_stanka.vnutr_nazv_cpu,
strftime('%d.%m.%Y', zurnal_cpu.data),
strftime('%H:%M', zurnal_cpu.vremia_ostanovki),
strftime('%H:%M', zurnal_cpu.vremia_sdaci),                                                                                                      
zurnal_cpu.pricina_ostanovki,
zurnal_cpu.code_error,
zurnal_cpu.tekst_oshibki,
zurnal_cpu.vipolnenie_raboti,
smeni.smeni                
                      
FROM
zurnal_cpu 
LEFT OUTER JOIN info_stanka ON info_stanka.id=zurnal_cpu.id_info_stanka
LEFT OUTER JOIN smeni ON smeni.id=zurnal_cpu.id_smeni

WHERE
(CASE WHEN '{poisk}' <> '' THEN info_stanka.invent_nomer LIKE '%{poisk}%' or
info_stanka.vnutr_nazv_cpu LIKE '%{poisk}%' or
zurnal_cpu.pricina_ostanovki LIKE '%{poisk}%' or
zurnal_cpu.code_error LIKE '%{poisk}%' or 
zurnal_cpu.tekst_oshibki LIKE '%{poisk}%' or
zurnal_cpu.vipolnenie_raboti LIKE '%{poisk}%'  
ELSE 1=1 END) AND
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(zurnal_cpu.data) = date({DateTimePicker1}) ELSE 1=1 END) AND
(CASE WHEN {ComboBox1} <> -1 THEN zurnal_cpu.id_smeni = {ComboBox1} ELSE 1=1 END)
                                                    
ORDER BY zurnal_cpu.id DESC