簡単に言えば、任意の文字列を整数に変換できるようにしたいと考えています。できれば整数のサイズを制限し、結果が常に同じになるようにしたいと考えています。言い換えれば、オラクルがサポートする、数値を返すハッシュ関数があり、その値に最大値を設定できるでしょうか?
必要に応じてコンテキストを提供するために、次の簡略化された形式の 2 つのテーブルがあります。
表 1 表 2 ID | シーケンス番号 ID | シーケンス番号 -------------------- ------------- 1 | 1 1 | 2QD44561 1 | 2 1 | 6HH00244 2 | 1 2 | 5DH08133 3 | 1 3 | 7RD03098 4 | 2 4 | 8BF02466
列sequence_number
はnumber(3)
表 1 とvarchar2(11)
表 2 にあります。これは、両方のテーブルの主キーの一部です。
データは外部から提供され、変更できません。表 1 では単純な順序で作成されていると思いますが、表 2 では意味があります。データは構成されていますが、代表的なものです。
number(3)
フィールドを出力すると誰かが約束しました。これは最初のテーブルの列では問題ありませんが、2 番目のテーブルでは問題が発生します。
sequence_number
1000未満の整数(簡単)に変換できるようにしたいと思います(より難しい) 、可能な場合は定数です(一見不可能です)。'2QD44561'
これは、常に戻りたいという意味です586
。2 つの文字列が同じ数値を返すかどうかは問題ではありません。
使用できる整数に変換するだけutl_raw.cast_to_number()
です:
select utl_raw.cast_to_number((utl_raw.cast_to_raw('2QD44561'))) from dual;
UTL_RAW.CAST_TO_NUMBER((UTL_RAW.CAST_TO_RAW('2QD44561')))
---------------------------------------------------------
-2.033E+25
しかし、ご覧のとおり、これは 1000 未満ではありません。
また、何かを思いつくことができるかどうかを確認するためにdbms_crypto
andをいじっていましたが、小さな整数を取得することができませんでした。utl_encode
方法はありますか?