Това е често срещан проблем и няма перфектно решение. Няколко решения:
1. Дефинирайте X полета от тип varchar2, Y полета от тип номер и Z полета от тип date. Това излиза като потенциално 3 пъти повече персонализирани полета, но никога повече няма да имате проблеми с преобразуването.
Вашият пример ще излезе така:
Id Name field_char1 field2_char2 field_char3 ... field_num1 field_num2 ...
1 lap1 lappy lappy lappy ... 12 13
2 lap2 lappy2 lappy2 lapp2 ... 13 12
Във вашия пример имате еднакъв брой числови стойности и стойности на знаци и в двата реда, но не е задължително да е така:третият ред може да няма числово поле например.
2. Дефинирайте X полета от тип varchar2 и приложете биективна функция за съхраняване на поле за номер или дата (например датата може да се съхранява като YYYYMMDDHH24miss
). Ще ви трябва и допълнително поле, което ще дефинира контекста на реда. Ще приложите to_number
или to_char
функционира само когато редовете са от добър тип.
Вашият пример:
Id Name context field1 field2 field3 field4 field5
1 lap1 type A lappy lappy 12 13 lappy
2 lap2 type B lappy2 13 lappy2 lapp2 12
Можете да направите запитване към таблицата, като използвате DECODE или CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Вторият дизайн е този, използван в Oracle Financials ERP (наред с други). Контекстът ви позволява да дефинирате ограничения на CHECK с този дизайн (например CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
), за да гарантирате целостта.