To częsty problem i nie ma idealnego rozwiązania. Kilka rozwiązań:
1. Zdefiniuj X pól typu varchar2, Y pól typu numer i Z pól typu data. Oznacza to potencjalnie trzykrotność liczby pól niestandardowych, ale już nigdy nie będziesz mieć problemu z konwersją.
Twój przykład wygląda tak:
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
W twoim przykładzie masz taką samą liczbę wartości numerycznych i znakowych w obu wierszach, ale nie musi tak być:na przykład trzeci wiersz może nie mieć pola liczbowego.
2. Zdefiniuj X pól typu varchar2 i zastosuj funkcję bijective do pola numeru magazynu lub daty (na przykład Data może być przechowywana jako YYYYMMDDHH24miss
). Potrzebne będzie również dodatkowe pole, które określi kontekst wiersza. Powinieneś zastosować to_number
lub to_char
działają tylko wtedy, gdy wiersze są dobrego typu.
Twój przykład:
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
Możesz zapytać o tabelę za pomocą DECODE lub CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Drugi projekt to ten, który został wykorzystany w Oracle Financials ERP (m.in.). Kontekst umożliwia zdefiniowanie ograniczeń CHECK z tym projektem (na przykład CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
) w celu zapewnienia integralności.