Объединение нескольких полей в одну строку (поле)
Объединение нескольких полей в одну строку (поле)
В приложении необходимо вести некоторый специфический лог действий пользователя. Для этого решили завести таблицу, в которую будет добавлятся информация о пользователе и таблице с которой проризведены соответствующие действия. Информация о значениях полей таблицы ДО изменений хранится в varchar поле в строке (ИМЯ_ПОЛЯ: СТАРОЕ_ЗНАЧЕНИЕ, и тп.). Добавление информации в лог, происходит по триггеру (пример тригера приведен ниже).
Используется сервер FireBird 1.5.
ПРОБЛЕМА:
В случае если хотябы обно из объединяемых полей имеет значение NULL, то вставляется пустая строка.
-- ПРИМЕР :
begin
if(...) then
begin
insert into ALOG (user_name,
table_name,
record_id,
action_name,
data_x)
values (user,
'QWERTY',
old.id,
1,
'Изменение записи: ' ||
'ID=' || old.ID ||
',QQ=' || old.QQ ||
',AA=' || old.AA ||
',BB=' || old.BB ||
',CC=' || old.CC ||
);
end
end
-- -- -- -- --
Используется сервер FireBird 1.5.
ПРОБЛЕМА:
В случае если хотябы обно из объединяемых полей имеет значение NULL, то вставляется пустая строка.
-- ПРИМЕР :
begin
if(...) then
begin
insert into ALOG (user_name,
table_name,
record_id,
action_name,
data_x)
values (user,
'QWERTY',
old.id,
1,
'Изменение записи: ' ||
'ID=' || old.ID ||
',QQ=' || old.QQ ||
',AA=' || old.AA ||
',BB=' || old.BB ||
',CC=' || old.CC ||
);
end
end
-- -- -- -- --
-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
Re: Объединение нескольких полей в одну строку (поле)
Используй, скажем, вместо old.ID - coalesce(old.ID, 'не указан') и т.д. все значения null будут заменены на 'не указан'.
Вообще это нормально, также как и если ты делаешь sum(поле) и в значениях поля этого будет нул - результат будет тотже...
Вообще это нормально, также как и если ты делаешь sum(поле) и в значениях поля этого будет нул - результат будет тотже...
Re: Объединение нескольких полей в одну строку (поле)
Угу.Mor писал(а):Используй, скажем, вместо old.ID - coalesce(old.ID, 'не указан') и т.д. все значения null будут заменены на 'не указан'.
Угу.Mor писал(а): Вообще это нормально,
Ой. А мужики-то не знают... (С)Mor писал(а): если ты делаешь sum(поле) и в значениях поля этого будет нул - результат будет тотже...
Re: Объединение нескольких полей в одну строку (поле)
Вот пожалуйста, о чём я и говорил в своём топе - ценнейший пост! Поугукал и (внимание) СОСТРИЛ! Незнали, раз спрашивали.
Re: Объединение нескольких полей в одну строку (поле)
create table test (a int)Mor писал(а):Вот пожалуйста, о чём я и говорил в своём топе - ценнейший пост! Поугукал и (внимание) СОСТРИЛ! Незнали, раз спрашивали.
insert into test (a) values (1)
insert into test (a) values (null)
select * from test
A
===========
1
<null>
select sum(a) from test
SUM
===========
1
иди учи уроки.
Re: Объединение нескольких полей в одну строку (поле)
Ой, и в правду прогнал, так тока со строками...
Ну давай глумись, гений,- твой звёздный час... 


-
- Заслуженный разработчик
- Сообщения: 644
- Зарегистрирован: 15 фев 2005, 11:34
В целом направление верное. На 1.5 coalesce поможет, нет - как ты писал, на if-ах, но пропускать поля через буферный varchar, накрывающий по длине все типы в записи. Единственная трабла единого лога на все таблицы - у таймштампов строковое представление миллисекунды отрезает, нумерики первого диалекта на базе плавающих типов будут писаться без хвостов, как нумерики третьего. Если это имеет значение для приложения.