WHERE выбрать все, иначе из списка
Модератор: Модераторы
WHERE выбрать все, иначе из списка
Здравствуйте!
В базе есть поле, например, 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"?
з.ы. Скорость не важна.
В базе есть поле, например, 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"?
з.ы. Скорость не важна.
Re: WHERE выбрать все, иначе из списка
Возможного решения:
(program)
при выбор ALL на :type присвоить NULL
SQLQuery1.ParamByName('type').Value := NULL;
(sql)
... WHERE type LIKE (COALESCE(:type, '%'))
(program)
при выбор ALL на :type присвоить NULL
SQLQuery1.ParamByName('type').Value := NULL;
(sql)
... WHERE type LIKE (COALESCE(:type, '%'))
Последний раз редактировалось valyo 22.05.2016 18:31:55, всего редактировалось 2 раза.
Re: WHERE выбрать все, иначе из списка
а если "All" заменить на "ALL"?
Добавлено спустя 3 часа 9 минут 46 секунд:
Схожая тема:
http://stackoverflow.com/questions/12416503/delphi-query-parameter-usage-when-all-values-is-also-an-option Но..о.
В лазаре есть "юмор":
valyo
Добавлено спустя 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 КБ) 206202 скачивания
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Re: WHERE выбрать все, иначе из списка
Можно сделать :
Где "value=-1" означает "все значения db_field", прочие значения сработают только если "value=db_field".
Вместо "-1" может быть любое значение, не встречающее среди значений "db_field".
Код: Выделить всё
..WHERE <value> IN (-1,db_field) Где "value=-1" означает "все значения db_field", прочие значения сработают только если "value=db_field".
Вместо "-1" может быть любое значение, не встречающее среди значений "db_field".
Re: WHERE выбрать все, иначе из списка
А ларчик просто открывается. Что то склероз достал. Или не открывается и это не склероз 
- Вложения
-
- fb_test.7z
- (59.48 КБ) 330645 скачиваний
Re: WHERE выбрать все, иначе из списка
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;
Re: WHERE выбрать все, иначе из списка
по-моему проще, чем так, невозможно:
естественно :type='ALL' можно заменить на любую проверку "нулевой строки" (вроде предложения использовать -1 и т.п.)
Код: Выделить всё
select ...
where
((type =:type) or (:type = 'All'))
естественно :type='ALL' можно заменить на любую проверку "нулевой строки" (вроде предложения использовать -1 и т.п.)
Re: WHERE выбрать все, иначе из списка
скалогрыз и остальные: как ни пИчально но лазарь такое не пропускает (...where (clientid = :clientid or :clientid = -1).. или is null). Т.е. стандартные компоненты в т.ч. и зеос (на птичке). Зато мсе всё обрабатывает правильно (Мартин над компонентами поработал на отлично).
Возможно как то и можно запустить подобный запрос в лазаре. Если у кого получится то сорцами подсобите
Из тех вариантов что у меня сработало:
1. Простая подмена запроса (1-й архив);
2. Использовать Like в параметре (2-й архив).
Возможно другие наборы датасетов и обработают похожий запрос (сомнительно). Все тесты проводил в лине с транк версиями лазаря и фпс. База птички - их дефолтная.
И всё равно на TComboBox надо вешать обработчик. Который и будет "подсовывать" необходимый параметр.
Возможно как то и можно запустить подобный запрос в лазаре. Если у кого получится то сорцами подсобите
Из тех вариантов что у меня сработало:
1. Простая подмена запроса (1-й архив);
2. Использовать Like в параметре (2-й архив).
Возможно другие наборы датасетов и обработают похожий запрос (сомнительно). Все тесты проводил в лине с транк версиями лазаря и фпс. База птички - их дефолтная.
И всё равно на TComboBox надо вешать обработчик. Который и будет "подсовывать" необходимый параметр.
Re: WHERE выбрать все, иначе из списка
скалогрыз писал(а):((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 страниц, но наверное проще уже не найду.
Re: WHERE выбрать все, иначе из списка
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;
Re: WHERE выбрать все, иначе из списка
скалогрыз писал(а):а что там за ошибка?
Кхе, я ничего не понимаю, чертовщина какая-то. Не могу её воспроизвести. Всё работает как в вашем коде!
Ошибка была вроде, что поле "All" не существует. Еще перепроверял и так и эдак, потом уже эту тему открыл.
Re: WHERE выбрать все, иначе из списка
resident писал(а):Кхе, я ничего не понимаю, чертовщина какая-то. Не могу её воспроизвести.
А вот это действительно грустно. Да и времени жалко на воспроизвеодство ошибки.
Re: WHERE выбрать все, иначе из списка
Похоже вчера что-то в системе сбоило. Потому как некоторые TSQLQuery, которые вчера создал, были пустыми, если сразу открывать. Заполнялись, только если в других что-то сделать. Думал "завтра" разберусь, а сегодня работает всё.
А этот WHERE сейчас работает даже без скобок.
з.ы. Кстати, когда вылетает ошибка, то иногда выскакивает какое-то большое лазарусовское окно, там еще туча нулей. Так вот у меня редактор кода на весь экран, и если это окно не закрыть, то я этого не замечаю, но оно висит. Хотя уже много раз после этого останавливал и перезапускал проект. Может быть когда это окно висело, весь Лазарус глючил.
А этот WHERE сейчас работает даже без скобок.
з.ы. Кстати, когда вылетает ошибка, то иногда выскакивает какое-то большое лазарусовское окно, там еще туча нулей. Так вот у меня редактор кода на весь экран, и если это окно не закрыть, то я этого не замечаю, но оно висит. Хотя уже много раз после этого останавливал и перезапускал проект. Может быть когда это окно висело, весь Лазарус глючил.
Re: WHERE выбрать все, иначе из списка
предложу свой вариант:
where 1=1
ну оформите уже сами
where 1=1
ну оформите уже сами
