Dit is een veelvoorkomend probleem en er is geen perfecte oplossing. Een paar oplossingen:
1. Definieer X velden van het type varchar2, Y velden van het type nummer en Z velden van het type datum. Dat komt neer op mogelijk 3 keer het aantal aangepaste velden, maar u zult nooit meer een conversieprobleem hebben.
Uw voorbeeld zou er als volgt uit komen te zien:
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
In uw voorbeeld heeft u hetzelfde aantal numerieke waarden en tekenwaarden op beide rijen, maar het hoeft niet zo te zijn:de derde rij zou bijvoorbeeld geen numeriek veld kunnen hebben.
2. Definieer X-velden van het type varchar2 en pas een bijectieve functie toe om het nummer of het datumveld op te slaan (Datum kan bijvoorbeeld worden opgeslagen als YYYYMMDDHH24miss
). U hebt ook een extra veld nodig dat de context van de rij bepaalt. Je zou de to_number
. toepassen of to_char
werken alleen als de rijen van het goede type zijn.
Jouw voorbeeld:
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
U kunt de tabel opvragen met DECODE of CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Het tweede ontwerp is het ontwerp dat (onder andere) in de Oracle Financials ERP wordt gebruikt. Met de context kunt u CHECK-beperkingen definiëren met dit ontwerp (bijvoorbeeld CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
) om de integriteit te waarborgen.