Я создал простую таблицу для хранения пар имя-значение.
create table ifr_nvpairs
(
name varchar(255) PRIMARY KEY,
type char(5),
string varchar(255),
bit_value bit,
int_value bigint,
dec_value decimal(12,2),
float_value float,
date_value datetime,
char_value varchar(255)
);
Существует ограничение и триггеры, гарантирующие, что
insert ifr_nvpairs(name,bit_value) values ('bitValue',1);
приведет к
bitValue BIT 1 true (null) (null) (null) (null) (null)
Я пропущу их здесь для краткости и дам несколько полных вставок:
INSERT INTO "ifr_nvpairs" ("name", "type", "string", "bit_value", "int_value", "dec_value", "float_value", "date_value", "char_value") VALUES ('bitValue', 'BIT ', '1', true, null, null, null, null, null);
INSERT INTO "ifr_nvpairs" ("name", "type", "string", "bit_value", "int_value", "dec_value", "float_value", "date_value", "char_value") VALUES ('charValue', 'CHAR ', 'Hugo ist nett!', null, null, null, null, null, 'Hugo ist nett!');
INSERT INTO "ifr_nvpairs" ("name", "type", "string", "bit_value", "int_value", "dec_value", "float_value", "date_value", "char_value") VALUES ('dateValue', 'DATE ', '2020-01-13 00:00:00.000', null, null, null, null, '2020-01-13 00:00:00', null);
INSERT INTO "ifr_nvpairs" ("name", "type", "string", "bit_value", "int_value", "dec_value", "float_value", "date_value", "char_value") VALUES ('decValue', 'DEC ', '8.15', null, null, 8.15, null, null, null);
INSERT INTO "ifr_nvpairs" ("name", "type", "string", "bit_value", "int_value", "dec_value", "float_value", "date_value", "char_value") VALUES ('floatValue', 'FLOAT', '3.14159', null, null, null, 3.14, null, null);
INSERT INTO "ifr_nvpairs" ("name", "type", "string", "bit_value", "int_value", "dec_value", "float_value", "date_value", "char_value") VALUES ('intValue', 'INT ', '42', null, 42, null, null, null, null);
Для удобства пользователей я хотел создать выборку, которая возвращает значение в сохраненном типе.
Мой подход был
select
case type
when 'BIT' then bit_value
when 'INT' then int_value
when 'DEC' then dec_value
when 'FLOAT' then float_value
when 'DATE' then date_value
when 'CHAR' then char_value
end result
from ifr_nvpairs where name='bitValue';
Я бы не удивился, если бы произошла ошибка. Но результатом всегда является дата и время.
Почему? И есть ли возможность в SQL выбрать тип гетерогена?
TIA Jo