Конференция "Базы" » Как в параметр передать Null [D7, FireBird]
 
  • alexis (28.02.12 16:26) [0]
    Делаю обычный селект  с параметрами
    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;
  • Loginov Dmitry © (28.02.12 16:30) [1]
    IS NULL
  • alexis (28.02.12 16:34) [2]
    В самом запросе можно Is Null написать, а как в параметре передать?
  • alexis (28.02.12 17:16) [3]
    Забыл написать, компонент TIBDataSet используется.
  • Anatoly Podgoretsky © (28.02.12 17:59) [4]
    > alexis  (28.02.2012 16:26:00)  [0]

    Сравнивать с Null нельзя, поскольку смысла не имеет
  • alexis (28.02.12 18:05) [5]
    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)

    Пришлось вот такую фигню написать, оно конечно работает, но как то это не правильно
  • Inovet © (28.02.12 19:39) [6]
    > [5] alexis   (28.02.12 18:05)
    > оно конечно работает, но как то это не правильно

    Сказали же IS NULL
  • alexis (29.02.12 11:36) [7]

    > Сказали же IS NULL

    И как это передать в параметре?
  • Плохиш © (29.02.12 12:30) [8]
    TaskDS.ParamByName('ID_FOKUS').Clear;
  • Ega23 © (29.02.12 12:34) [9]

    > как это передать в параметре?


    Param.Value := Null;



    Ну и вдогонку


    > Сравнивать с Null нельзя, поскольку смысла не имеет


    where (:param1 is null) or (column=:param2)
  • alexis (29.02.12 12:45) [10]

    > Плохиш ©   (29.02.12 12:30) [8]
    > TaskDS.ParamByName('ID_FOKUS').Clear;

    Не работает.
  • Ega23 © (29.02.12 12:49) [11]

    > Не работает.


    Если правильно делать - работает.
  • Anatoly Podgoretsky © (29.02.12 13:25) [12]
    > Ega23  (29.02.2012 12:34:09)  [9]

    Где здесь сравнение с Null?
    is null не сравнение с Null
  • Ega23 © (29.02.12 13:36) [13]

    > Anatoly Podgoretsky ©   (29.02.12 13:25) [12]


    Я не тебе, а ТС писал. Как это можно обойти, с параметрами.
  • andpr99 (27.04.15 15:13) [14]

    > where (:param1 is null) or (column=:param2)


    у меня такая схема не работает.
    пишет: unknown SQL data type (32766)
  • andpr99 (27.04.15 15:30) [15]
    Выкручиваюсь так:

       if VarIsNull(cxLookupComboBox2.EditValue) then
         AddCondition('c6','PLASMA.OUT_DEST_DET IS NULL', true)
       else
         AddCondition('c6','PLASMA.OUT_DEST_DET = '+cxLookupComboBox2.EditValue, true)

  • кгшзх © (27.04.15 18:18) [16]
    and ID_FOCUS=IsNull(:ID_FOKUS,ID_FOCUS)
  • andpr99 (27.04.15 19:19) [17]

    > and ID_FOCUS=IsNull(:ID_FOKUS,ID_FOCUS)

    IsNull - Это COALESCE?

    Это решает проблему пустого параметра, но задача чуть шире.
    Нужна такая конструкция:
    ((:ID_FOCUS is NULL) and (ID_FOCUS is NULL)) or
    ID_FOCUS=:ID_FOKUS
    Значение или равны или оба пустые.
    А первое выражение вызывает описанную выше ошибку.
  • junglecat © (27.04.15 19:42) [18]
    там проблема в том, что он 2-й :ID_FOKUS не подхватывает в запросе?
  • кгшзх © (27.04.15 19:57) [19]
    Это решает проблему пустого параметра, но задача чуть шире.

    шире чем лоб?
    в чем трудность-то?
    передать в параметр пустую строку и сделать isnull и к полю и к параметру?
  • andpr99 (27.04.15 20:37) [20]
    Тогда наверное так:
    COALESCE(ID_FOCUS,'')=:ID_FOCUS
    А если параметр = NULL, то ставить туда пустую строку перед выполнением запроса.

    А почему в 2012 году у людей такое работало?

    > where (:param1 is null) or (column=:param2)


    junglecat: пишет unknown SQL data type (32766)
  • кгшзх © (27.04.15 20:46) [21]
    Тогда наверное так:

    ответ он не в плоскости синтаксиса.
    он в логике запроса.

    если с клиента в параметр переда нулл или пустая строка, то что должно быть?
    запрос должен вернуть те записи где нулл/пустая строка?
    или запрос вообще не должен принимать во внимание любые условия по полю параметра?
  • andpr99 (27.04.15 20:59) [22]
    Запрос должен вернуть все записи, где значение поля совпадает со значением параметра. В том числе если значения NULL.
    'a' = 'a'
    'b' = 'b'
    NULL = NULL
  • кгшзх © (27.04.15 21:12) [23]
    1. для отбора поля по нулу параметр не нужен
    2. если параметр есть, то поле нужно привести к ненунулу, чтобы можно было сравнивать на равенство через =

    что еще-то  мусолить?
 
Конференция "Базы" » Как в параметр передать Null [D7, FireBird]
Есть новые Нет новых   [118591   +45][b:0][p:0.001]