残念ながら、文字列リテラルを数値形式で含めることはできません。そうしないと、16進文字列を数値に変換してから再度戻し、フォーマットマスクの適切な場所にリテラルを挿入できます。ただし、これは日付に対してのみ行うことができます。
>
substr()
を使用できます 位置が固定されているので。あなたはそれを心配していました
明らかに、各SUBSTRが異なるSYS_GUIDを処理するため、substrと連結を使用することはできません。
サブクエリ因数分解(別名、共通テーブル式/ CTE)を使用することは、substr()
を意味します。 そのCTEからの行の呼び出しは、すべて同じGUIDを参照します。このメソッドは、それぞれに対して新しいSYS_GUIDを生成しません。
with t as (
select rawtohex(sys_guid()) guid from dual
connect by level <= 2
)
select guid, substr(guid, 1, 8)
||'-'|| substr(guid, 9, 4)
||'-'|| substr(guid, 13, 4)
||'-'|| substr(guid, 17, 4)
||'-'|| substr(guid, 21, 12) as formatted_guid
from t;
GUID FORMATTED_GUID
-------------------------------- ----------------------------------------
2F6BA62518F926D0E0534D49E50ABB46 2F6BA625-18F9-26D0-E053-4D49E50ABB46
2F6BA62518FA26D0E0534D49E50ABB46 2F6BA625-18FA-26D0-E053-4D49E50ABB46
これは、大量のデータの正規表現よりもはるかに高速です。ループ内に100000個の値がある場合(PL / SQLブロック内で、ループ内で最小限の作業を実行して実際に正しく評価されるようにし、dbms_utility.get_cpu_time
を使用する 経過時間を確認するには)正規表現バージョンは約2.51秒かかりますが、部分文字列バージョンは約0.29秒かかります。もちろん、システムは異なる数を取得しますが、それでもほぼ同じ桁数である必要があります。