powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметризованный запрос с NULL
11 сообщений из 11, страница 1 из 1
Параметризованный запрос с NULL
    #32073032
FAGIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется запрос (встроенный в процедуру) с N параметров,
запрос выбирает записи где все значение совпадают:

where
(col1 = :par1)
and
(col2 = :par2)
....

как сделать, чтобы в качестве параметров можно было заводить NULL и чтобы работало корректно.
В таком виде запрос не выдает записей, даже когда
и COL1 - NULL и PAR1 - NULL?
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073109
noir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быстро прячся!!! Сейчас в тебя будут кидаться томами Дейта, жаловаться на незнание молодым поколением реляционной теории и трехзначной логики, и вообще...


Короче, NULL в теории ничему не равен, даже самому себе.
(для этого IS NULL/NOT NULL и нужны)

Стало быть, единственный способ - заменять = на IS NULL прямо в тексте запроса... :(
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073119
Paseek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е.:

where
((:par1 Is Null) Or (col1 = :par1) )
and
((:par2 Is Null) Or (col2 = :par2))
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073120
Paseek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поспешил. Надо так:

Т.е.:

where
(((:par1 Is Null) And (col1 Is Null)) Or (col1 = :par1) )
and
(((:par2 Is Null) And (col2 Is Null)) Or (col2 = :par2))
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073121
noir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нее... Ведь при такой конструкции NULL'ы будут возвращаться всегда, даже если par1, par2 - не NULL.... А это, вопрошавшему, как я понял, не нада...
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073122
Paseek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну да, это я как раз и заметил :-), потому поправился...
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073123
noir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возражение снимается, мысль гениальна.
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073235
FAGIM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решение (A=B)or((A is NULL)and(B is NULL) я нашел сам, но кроме этого проверил еще 2 варианта:

STOREDPROC:
Для каждого типа данных пишется "булевая" процедура, сначала проверяющая на нулы, а затем сравнивает.
Кстати, хотя читается в итоге легче, но работает слегка медленнее. Но первый метод не годится!!! в ISQL!!!

3 - c UDF-ами - возможно самый быстрый, но одна проблема - строки действительно передаются nil-ами,
а вот например NULL интеджера передается все равно как 0
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32073322
_none_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(A=B)or((A is NULL)and(B is NULL)

Этот вариант давно известен, но делает не совсем то, о чем вы говорили в начале... Так зачем людей было дурить?
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32308158
Фотография oz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, как в IB, но в FB (1.5) корректно сравнить данные можно с использованием такой конструкции:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 1  = 
   CASE :par1
      WHEN NULL THEN
         CASE col1
            WHEN NULL THEN  1 
            ELSE  2 
         END
      ELSE
         CASE col1
            WHEN :par1 THEN  1 
            ELSE  2 
         END
   END
...
Рейтинг: 0 / 0
Параметризованный запрос с NULL
    #32308203
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно конечно.... но я присваиваю null параметру и у меня работает конструкция вида...

where (col1 = :par1)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметризованный запрос с NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]