-
Делаю обычный селект с параметрами
select * from TASK where ID_OIV=:ID and ID_TAGET=:ID_TAGET and ID_SUBTAG=:ID_SUBTAG and ID_FOCUS=:ID_FOKUS
Все работает. Но как только один из параметров имеет значение NULL, запрос ничего не возвращает, хотя записи в базе есть.
Как только не пробовал передать параметр, ничего не выходит:
TaskDS.ParamByName('ID_FOKUS').Value:=Null();
TaskDS.ParamByName('ID_FOKUS').AsInteger:=Null;
-
IS NULL
-
В самом запросе можно Is Null написать, а как в параметре передать?
-
Забыл написать, компонент TIBDataSet используется.
-
> alexis (28.02.2012 16:26:00) [0]
Сравнивать с Null нельзя, поскольку смысла не имеет
-
select * from TASK where ID_OIV=:ID and ID_TAGET=:ID_TAGET and ID_SUBTAG=:ID_SUBTAG and (ID_FOCUS=:ID_FOKUS or :ID_FOKUS=0)
Пришлось вот такую фигню написать, оно конечно работает, но как то это не правильно
-
> [5] alexis (28.02.12 18:05)
> оно конечно работает, но как то это не правильно
Сказали же IS NULL
-
> Сказали же IS NULL
И как это передать в параметре?
-
TaskDS.ParamByName('ID_FOKUS').Clear;
-
> как это передать в параметре?
Param.Value := Null;
Ну и вдогонку
> Сравнивать с Null нельзя, поскольку смысла не имеет
where (:param1 is null) or (column=:param2)
-
> Плохиш © (29.02.12 12:30) [8]
> TaskDS.ParamByName('ID_FOKUS').Clear;
Не работает.
-
> Не работает.
Если правильно делать - работает.
-
> Ega23 (29.02.2012 12:34:09) [9]
Где здесь сравнение с Null?
is null не сравнение с Null
-
> Anatoly Podgoretsky © (29.02.12 13:25) [12]
Я не тебе, а ТС писал. Как это можно обойти, с параметрами.
-
> where (:param1 is null) or (column=:param2)
у меня такая схема не работает.
пишет: unknown SQL data type (32766)
-
Выкручиваюсь так:
if VarIsNull(cxLookupComboBox2.EditValue) then
AddCondition('c6','PLASMA.OUT_DEST_DET IS NULL', true)
else
AddCondition('c6','PLASMA.OUT_DEST_DET = '+cxLookupComboBox2.EditValue, true)
-
and ID_FOCUS=IsNull(:ID_FOKUS,ID_FOCUS)
-
> and ID_FOCUS=IsNull(:ID_FOKUS,ID_FOCUS)
IsNull - Это COALESCE?
Это решает проблему пустого параметра, но задача чуть шире.
Нужна такая конструкция:
((:ID_FOCUS is NULL) and (ID_FOCUS is NULL)) or
ID_FOCUS=:ID_FOKUS
Значение или равны или оба пустые.
А первое выражение вызывает описанную выше ошибку.
-
там проблема в том, что он 2-й :ID_FOKUS не подхватывает в запросе?
-
Это решает проблему пустого параметра, но задача чуть шире.
шире чем лоб?
в чем трудность-то?
передать в параметр пустую строку и сделать isnull и к полю и к параметру?