powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обновить поле если значение не NULL
10 сообщений из 10, страница 1 из 1
Обновить поле если значение не NULL
    #39486104
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый вечер.

Возник вопрос: возможно ли в SP Firebird как-нибудь реализовать такую конструкцию без if?
Код: sql
1.
2.
3.
4.
if (type is null) then
  update <table> set value = :value where id = :id
else 
  update <table> set type = :type, value = :value where id = :id;


Т.е. чтобы значение type обновлялось только если новое значение не null, иначе оставалось старое. Или лучше сделать триггер на обновление?
Код: sql
1.
if (new.type is null) then new.type = old.type;
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39486117
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> иначе оставалось старое

"иначе оставалось старое" означает field = field.
Ну и if null - соответственно type = coalesce(:type, type)

alekcvp> Или лучше сделать триггер на обновление?

Лучше озвучить задачу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39486126
Жышы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp...возможно ли в SP Firebird как-нибудь реализовать такую конструкцию без if?
...
Ну и зачем? If как раз и сделан для употребления оного в SP|EB.
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39486131
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЛучше озвучить задачу.

Задача простая: есть SP, у которой три параметра - id, type и value. Она вызывается из разных мест приложения, и в некоторых из них ничего не известно о type, поэтому хочется иметь возможность вызвать эту процедуру как SPName(:ID, NULL, :VALUE), а не писать отдельный запрос.

Вариант с if и двумя (почти) одинаковыми строчками вызывает зуд у моего внутреннего перфекциониста :)
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39486134
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамсоответственно type = coalesce(:type, type)

Спасибо, это решение мне нравится.
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39486178
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На здоровье.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39489149
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы ещё в where добавил where type IS DISTINCT FROM :type and value IS DISTINCT FROM :value

просто для того, чтобы не копировать впустую строку, если там ничего не изменилось по факту
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39489316
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochпросто для того, чтобы не копировать впустую строку, если там ничего не изменилось по факту
Изменение Value в приложении контролируется, а type - smallint, на проверку издержки больше будут.
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39490582
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

какие нафиг издержки? строка в любом случае читается с диска и целиком распаковывается в буфере.

после этого либо в ней меняются два поля, на диске создаётся новая строка, и изменённый буфер в неё записывается, а старая строка на диске помечается, как мусор

сейчас это происходит в любом случае

либо в моём варианте в некоторых случаях после распаковки строки будет два сравнения, и если они не показали разницы - то остальные шаги просто игнорируются

overhead на сравнение двух значений по сравнению с чтением строки с диска и распаковкой - минимальный
а экономия на отсутствии создания на диске новой строки - заметная
...
Рейтинг: 0 / 0
Обновить поле если значение не NULL
    #39491390
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochoverhead на сравнение двух значений по сравнению с чтением строки с диска и распаковкой - минимальный
а экономия на отсутствии создания на диске новой строки - заметная
В общем случае - согласен, в моём конкретном: если Value не изменилось, то SP просто не будет вызвана, если изменилось, то не имеет значения, менялось Type или нет - всё равно надо писать
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обновить поле если значение не NULL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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