Este é um problema comum e não existe uma solução perfeita. Algumas soluções:
1. Defina campos X do tipo varchar2, campos Y do tipo número e campos Z do tipo data. Isso é potencialmente 3 vezes o número de campos personalizados, mas você nunca mais terá nenhum problema de conversão.
Seu exemplo ficaria assim:
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
No seu exemplo, você tem o mesmo número de valores numéricos e valores de caracteres em ambas as linhas, mas não precisa ser assim:a terceira linha pode não ter campo numérico, por exemplo.
2. Defina campos X do tipo varchar2 e aplique uma função bijetiva para armazenar o campo de número ou data (por exemplo, a data pode ser armazenada como
YYYYMMDDHH24miss
). Você também precisará de um campo extra que definirá o contexto da linha. Você aplicaria o to_number
ou to_char
funcionam somente quando as linhas são do tipo bom. Seu exemplo:
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
Você pode consultar a tabela usando DECODE ou CASE:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
O segundo design é o utilizado no ERP Oracle Financials (entre outros). O contexto permite-lhe definir restrições CHECK com este design (por exemplo
CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
) para garantir a integridade.