Dette er et almindeligt problem, og der er ingen perfekt løsning. Et par løsninger:
1. Definer X-felter af typen varchar2, Y-felter med typenummer og Z-felter af typedato. Det kommer ud som potentielt 3 gange antallet af tilpassede felter, men du vil aldrig have nogen konverteringsproblemer længere.
Dit eksempel ville komme sådan ud:
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 dit eksempel har du det samme antal numeriske værdier og tegnværdier på begge rækker, men det behøver ikke at være på denne måde:den tredje række kunne f.eks. ikke have noget numerisk felt.
2. Definer X-felter af typen varchar2 og anvend en bijektiv funktion til at gemme nummer eller datofelt (dato kunne f.eks. gemmes som YYYYMMDDHH24miss
). Du skal også bruge et ekstra felt, der definerer konteksten for rækken. Du skal anvende to_number
eller to_char
fungerer kun, når rækkerne er af den gode type.
Dit eksempel:
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 forespørge i tabellen ved hjælp af DECODE eller CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Det andet design er det, der blandt andet bruges i Oracle Financials ERP. Konteksten giver dig mulighed for at definere CHECK-begrænsninger med dette design (for eksempel CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
) for at sikre integritet.