これは一般的な問題であり、完全な解決策はありません。いくつかの解決策:
1。 タイプvarchar2のXフィールド、タイプ番号のYフィールド、およびタイプ日付のZフィールドを定義します。これは、カスタムフィールドの数の3倍になる可能性がありますが、変換の問題が発生することはもうありません。
あなたの例は次のようになります:
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
あなたの例では、両方の行に同じ数の数値と文字値がありますが、このようにする必要はありません。たとえば、3番目の行に数値フィールドを含めることはできません。
2。 タイプvarchar2のXフィールドを定義し、全単射関数を適用して数値または日付フィールドを格納します(たとえば、日付はYYYYMMDDHH24miss
として格納できます。 )。行のコンテキストを定義する追加のフィールドも必要になります。 to_number
を適用します またはto_char
行が適切なタイプの場合にのみ機能します。
あなたの例:
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
DECODEまたはCASEを使用してテーブルをクエリできます:
SELECT *
FROM laptop
WHERE CASE WHEN context = 'TYPE A' THEN to_number(field3) END = 12
2番目の設計は、(とりわけ)OracleFinancialsERPで使用されている設計です。コンテキストを使用すると、この設計でCHECK制約を定義できます(たとえば、CHECK (CASE WHEN context = 'TYPE A' THEN to_number(field3) > 0
)整合性を確保するため。