Toto je běžný problém a neexistuje dokonalé řešení. Několik řešení:
1. Definujte X polí typu varchar2, Y polí typu číslo a Z polí typu datum. To vychází jako potenciálně trojnásobek počtu vlastních polí, ale už nikdy nebudete mít žádný problém s převodem.
Váš příklad by vyšel takto:
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
Ve vašem příkladu máte na obou řádcích stejný počet číselných hodnot a hodnot znaků, ale nemusí to tak být:například třetí řádek nemůže obsahovat žádné číselné pole.
2. Definujte X polí typu varchar2 a použijte bijektivní funkci pro uložení pole čísla nebo data (například Datum může být uloženo jako YYYYMMDDHH24miss
). Budete také potřebovat další pole, které bude definovat kontext řádku. Aplikovali byste to_number
nebo to_char
fungovat pouze v případě, že jsou řádky typu dobrý.
Váš příklad:
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
Do tabulky můžete zadat dotaz pomocí DECODE nebo CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Druhý návrh je ten, který se používá v Oracle Financials ERP (mimo jiné). Kontext vám umožňuje definovat omezení CHECK s tímto návrhem (například CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
), aby byla zajištěna integrita.