Страница 1 из 1

Объединение нескольких полей в одну строку (поле)

Добавлено: 05 июл 2005, 08:02
iy
В приложении необходимо вести некоторый специфический лог действий пользователя. Для этого решили завести таблицу, в которую будет добавлятся информация о пользователе и таблице с которой проризведены соответствующие действия. Информация о значениях полей таблицы ДО изменений хранится в 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
-- -- -- -- --

Добавлено: 05 июл 2005, 08:36
Ivan_Pisarevsky
-- ПРИМЕР :
begin
if(...) then
begin
if (id is null) then id = 'null';
...
insert into ALOG (user_name, ...

Re: Объединение нескольких полей в одну строку (поле)

Добавлено: 05 июл 2005, 09:23
Mor
Используй, скажем, вместо old.ID - coalesce(old.ID, 'не указан') и т.д. все значения null будут заменены на 'не указан'.
Вообще это нормально, также как и если ты делаешь sum(поле) и в значениях поля этого будет нул - результат будет тотже...

Re: Объединение нескольких полей в одну строку (поле)

Добавлено: 05 июл 2005, 11:48
Merlin
Mor писал(а):Используй, скажем, вместо old.ID - coalesce(old.ID, 'не указан') и т.д. все значения null будут заменены на 'не указан'.
Угу.
Mor писал(а): Вообще это нормально,
Угу.
Mor писал(а): если ты делаешь sum(поле) и в значениях поля этого будет нул - результат будет тотже...
Ой. А мужики-то не знают... (С)

Re: Объединение нескольких полей в одну строку (поле)

Добавлено: 05 июл 2005, 12:23
Mor
Вот пожалуйста, о чём я и говорил в своём топе - ценнейший пост! Поугукал и (внимание) СОСТРИЛ! Незнали, раз спрашивали.

Re: Объединение нескольких полей в одну строку (поле)

Добавлено: 05 июл 2005, 12:30
Merlin
Mor писал(а):Вот пожалуйста, о чём я и говорил в своём топе - ценнейший пост! Поугукал и (внимание) СОСТРИЛ! Незнали, раз спрашивали.
create table test (a int)

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: Объединение нескольких полей в одну строку (поле)

Добавлено: 05 июл 2005, 12:43
Mor
Ой, и в правду прогнал, так тока со строками... :) Ну давай глумись, гений,- твой звёздный час... :)

Добавлено: 05 июл 2005, 13:06
Ivan_Pisarevsky
Merlin & Mor - развлекаетесь :lol:

посмотрел на свои каляки маляки выше - не заработает ведь :oops: :D
заругает на несоответствие типов, вопчем iy ты уж сам посмотри шоб типы совпадали, где надо можно CAST-ом подровнять...

Добавлено: 05 июл 2005, 13:30
Merlin
В целом направление верное. На 1.5 coalesce поможет, нет - как ты писал, на if-ах, но пропускать поля через буферный varchar, накрывающий по длине все типы в записи. Единственная трабла единого лога на все таблицы - у таймштампов строковое представление миллисекунды отрезает, нумерики первого диалекта на базе плавающих типов будут писаться без хвостов, как нумерики третьего. Если это имеет значение для приложения.