Detta är ett vanligt problem och det finns ingen perfekt lösning. Ett par lösningar:
1. Definiera X-fält av typen varchar2, Y-fält med typnummer och Z-fält av typdatum. Det kommer ut som potentiellt 3 gånger antalet anpassade fält men du kommer aldrig att ha några konverteringsproblem längre.
Ditt exempel skulle komma ut så här:
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
I ditt exempel har du samma antal numeriska värden och teckenvärden på båda raderna men det behöver inte vara så här:den tredje raden kan till exempel inte ha något numeriskt fält.
2. Definiera X-fält av typen varchar2 och använd en bijektiv funktion för att lagra nummer eller datumfält (till exempel kan Datum lagras som YYYYMMDDHH24miss
). Du behöver också ett extra fält som definierar radens kontext. Du skulle använda to_number
eller to_char
fungerar endast när raderna är av bra typ.
Ditt exempel:
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
Du kan fråga tabellen med DECODE eller CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Den andra designen är den som används i Oracle Financials ERP (bland annat). Kontexten låter dig definiera CHECK-begränsningar med denna design (till exempel CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
) för att säkerställa integritet.