Ini adalah masalah umum dan tidak ada solusi yang sempurna. Beberapa solusi:
1. Tentukan bidang X jenis varchar2, bidang Y jenis nomor dan bidang Z jenis tanggal. Itu berpotensi 3 kali lipat jumlah bidang khusus tetapi Anda tidak akan pernah memiliki masalah konversi lagi.
Contoh Anda akan keluar seperti ini:
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
Dalam contoh Anda, Anda memiliki jumlah nilai numerik dan nilai karakter yang sama pada kedua baris tetapi tidak harus seperti ini:misalnya, baris ketiga tidak boleh memiliki bidang numerik.
2. Tentukan bidang X tipe varchar2 dan terapkan fungsi bijektif untuk menyimpan nomor atau bidang tanggal (misalnya Tanggal dapat disimpan sebagai YYYYMMDDHH24miss
). Anda juga memerlukan bidang tambahan yang akan menentukan konteks baris. Anda akan menerapkan to_number
atau to_char
berfungsi hanya jika baris memiliki tipe yang baik.
Contoh Anda:
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
Anda dapat menanyakan tabel menggunakan DECODE atau CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
Desain kedua adalah yang digunakan dalam Oracle Financials ERP (antara lain). Konteks memungkinkan Anda untuk menentukan batasan CHECK dengan desain ini (misalnya CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
) untuk memastikan integritas.