WHERE выбрать все, иначе из списка

Модератор: Модераторы

WHERE выбрать все, иначе из списка

Сообщение resident » 22.05.2016 18:01:04

Здравствуйте!

В базе есть поле, например, type, среди значений которого есть "A", "B", "C".
В программе есть cbType: TComboBox c Lines = ("All", "A", "B", "C"), т.е. теже значения и еще "All".
В программе есть qr: TSQLQuery c SQL = ".... WHERE type = :type". В запрос через параметр передаю строку из ComboBox.

Когда я выбираю в ComboBox "A", "B", "C", то запрос работает на выборку конкретных записей с type = "A" или "B" или "C".
Подскажите как изменить запрос, чтобы он еще работал для выборки всех записей, когда в ComboBox выбрана нулевая строка "All"?
з.ы. Скорость не важна.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: WHERE выбрать все, иначе из списка

Сообщение valyo » 22.05.2016 18:46:46

Возможного решения:
(program)
при выбор ALL на :type присвоить NULL
SQLQuery1.ParamByName('type').Value := NULL;

(sql)
... WHERE type LIKE (COALESCE(:type, '%'))
Последний раз редактировалось valyo 22.05.2016 19:31:55, всего редактировалось 2 раз(а).
valyo
незнакомец
 
Сообщения: 2
Зарегистрирован: 16.09.2009 21:21:39

Re: WHERE выбрать все, иначе из списка

Сообщение pupsik » 22.05.2016 18:57:09

а если "All" заменить на "ALL"?

Добавлено спустя 3 часа 9 минут 46 секунд:
Схожая тема:
http://stackoverflow.com/questions/12416503/delphi-query-parameter-usage-when-all-values-is-also-an-option Но..о.
В лазаре есть "юмор":
IBConnection1 : Parameters of the type 'String' are not (yet) supported.


valyo
IBConnection1 : Fetch :
-Dynamic SQL Error
-SQL error code = -303
-arithmetic exception, numeric overflow, or string truncation
-string right truncation.
Вложения
fb_test.7z
не найс но...
(59.37 КБ) Скачиваний: 718
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: WHERE выбрать все, иначе из списка

Сообщение debi12345 » 23.05.2016 01:15:00

Можно сделать :
Код: Выделить всё
..WHERE <value> IN (-1,db_field)


Где "value=-1" означает "все значения db_field", прочие значения сработают только если "value=db_field".
Вместо "-1" может быть любое значение, не встречающее среди значений "db_field".
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5759
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: WHERE выбрать все, иначе из списка

Сообщение pupsik » 23.05.2016 02:40:41

А ларчик просто открывается. Что то склероз достал. Или не открывается и это не склероз :?
Вложения
fb_test.7z
(59.48 КБ) Скачиваний: 737
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: WHERE выбрать все, иначе из списка

Сообщение sign » 23.05.2016 07:06:34

resident писал(а):Подскажите как изменить запрос, чтобы он еще работал для выборки всех записей, когда в ComboBox выбрана нулевая строка "All"?

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
begin
  if ComboBox1.Text = 'All' then SQLQuery1.SQL.Text := 'SELECT ...'
  else begin
    SQLQuery1.SQL.Text := 'SELECT ... WHERE type = :type';
    SQLQuery1.ParamByName('type') := ...;
  end;
  SQLQuery1.Open;
end; 
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: WHERE выбрать все, иначе из списка

Сообщение скалогрыз » 23.05.2016 07:16:18

по-моему проще, чем так, невозможно:
Код: Выделить всё
select ...
where
  ((type =:type) or (:type = 'All'))

естественно :type='ALL' можно заменить на любую проверку "нулевой строки" (вроде предложения использовать -1 и т.п.)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: WHERE выбрать все, иначе из списка

Сообщение pupsik » 23.05.2016 08:36:51

скалогрыз и остальные: как ни пИчально но лазарь такое не пропускает (...where (clientid = :clientid or :clientid = -1).. или is null). Т.е. стандартные компоненты в т.ч. и зеос (на птичке). Зато мсе всё обрабатывает правильно (Мартин над компонентами поработал на отлично).
Возможно как то и можно запустить подобный запрос в лазаре. Если у кого получится то сорцами подсобите :D

Из тех вариантов что у меня сработало:
1. Простая подмена запроса (1-й архив);
2. Использовать Like в параметре (2-й архив).

Возможно другие наборы датасетов и обработают похожий запрос (сомнительно). Все тесты проводил в лине с транк версиями лазаря и фпс. База птички - их дефолтная.
И всё равно на TComboBox надо вешать обработчик. Который и будет "подсовывать" необходимый параметр.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: WHERE выбрать все, иначе из списка

Сообщение resident » 23.05.2016 13:30:00

скалогрыз писал(а):((type =:type) or (:type = 'All'))

Это первое с чем я обломался на коробочном Лазарусе :)

скалогрыз писал(а):естественно :type='ALL' можно заменить на любую проверку

Просмотрел pdf-ку по Postgre, а там нашел всяких функций кишмя. Пока выбрал такие варианты (наверное с поиском позиции будет побыстрее чем с вычислением заглавных букв, хотя на глаз все одинаково моментально):
Код: Выделить всё
(position(:type in 'All') > 0) AND (position('All' in :type) > 0)
(position(:type in 'All') > 0) AND (length(:type) = length('All'))
(upper(:type) = 'ALL')


Благодарю за ответы :)

Добавлено спустя 3 часа 35 секунд:
Еще проще:
Код: Выделить всё
CASE WHEN (:type = 'All') THEN true ELSE (type = :type) END

Можно конечно дальше полистать Postgres pdf-ку из 3000 страниц, но наверное проще уже не найду.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: WHERE выбрать все, иначе из списка

Сообщение скалогрыз » 23.05.2016 18:52:24

resident писал(а):Это первое с чем я обломался на коробочном Лазарусе

pupsik писал(а):скалогрыз и остальные: как ни пИчально но лазарь такое не пропускает (...where (clientid = :clientid or :clientid = -1).. или is null)

а что там за ошибка?
Ни разу на лазаре с базами данных не работал, только на delphi с MS tsql-ом.

Но если вспомнить глюки делфийского dbexpressa с параметрами,то я бы опробовал на лазаре для postgre сделать так
Код: Выделить всё
declare @type varchar(256) = :type

select ...
where ((type =@type) or (@type = 'All'))

или на худой конец, сделать параметры "ручками".
Код: Выделить всё
var
  s : string;
begin
  s:= ComboBox1.Text;
  s:=replaceString(s, #39,#39#39, [rfReplaceAll, rfIgnoreCase]);
  SQLQuery1.SQL.Text := ' declare @text = '''+s+''''+#10
   +'SELECT ... WHERE ((type =@type) or (@type = 'All'))';
end;
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: WHERE выбрать все, иначе из списка

Сообщение resident » 23.05.2016 20:47:12

скалогрыз писал(а):а что там за ошибка?

Кхе, я ничего не понимаю, чертовщина какая-то. Не могу её воспроизвести. Всё работает как в вашем коде!
Ошибка была вроде, что поле "All" не существует. Еще перепроверял и так и эдак, потом уже эту тему открыл.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: WHERE выбрать все, иначе из списка

Сообщение скалогрыз » 23.05.2016 20:49:25

resident писал(а):Кхе, я ничего не понимаю, чертовщина какая-то. Не могу её воспроизвести.

А вот это действительно грустно. Да и времени жалко на воспроизвеодство ошибки.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: WHERE выбрать все, иначе из списка

Сообщение resident » 23.05.2016 22:06:19

Похоже вчера что-то в системе сбоило. Потому как некоторые TSQLQuery, которые вчера создал, были пустыми, если сразу открывать. Заполнялись, только если в других что-то сделать. Думал "завтра" разберусь, а сегодня работает всё.
А этот WHERE сейчас работает даже без скобок.

з.ы. Кстати, когда вылетает ошибка, то иногда выскакивает какое-то большое лазарусовское окно, там еще туча нулей. Так вот у меня редактор кода на весь экран, и если это окно не закрыть, то я этого не замечаю, но оно висит. Хотя уже много раз после этого останавливал и перезапускал проект. Может быть когда это окно висело, весь Лазарус глючил.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: WHERE выбрать все, иначе из списка

Сообщение helga » 26.05.2016 21:25:44

предложу свой вариант:
where 1=1
ну оформите уже сами :)
helga
новенький
 
Сообщения: 14
Зарегистрирован: 26.05.2016 20:51:06


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

Рейтинг@Mail.ru