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

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
iy
Сообщения: 1
Зарегистрирован: 05 июл 2005, 07:43

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

Сообщение iy » 05 июл 2005, 08:02

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

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 05 июл 2005, 08:36

-- ПРИМЕР :
begin
if(...) then
begin
if (id is null) then id = 'null';
...
insert into ALOG (user_name, ...

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

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

Сообщение Mor » 05 июл 2005, 09:23

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

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

Сообщение Merlin » 05 июл 2005, 11:48

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

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

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

Сообщение Mor » 05 июл 2005, 12:23

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

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

Сообщение Merlin » 05 июл 2005, 12:30

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

иди учи уроки.

Mor
Сообщения: 14
Зарегистрирован: 20 июн 2005, 09:00

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

Сообщение Mor » 05 июл 2005, 12:43

Ой, и в правду прогнал, так тока со строками... :) Ну давай глумись, гений,- твой звёздный час... :)

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 05 июл 2005, 13:06

Merlin & Mor - развлекаетесь :lol:

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 05 июл 2005, 13:30

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

Ответить