sql >> データベース >  >> RDS >> Oracle

REGEXP_REPLACEおよびPL/SQLを使用しないUUID文字列のフォーマット

    残念ながら、文字列リテラルを数値形式で含めることはできません。そうしないと、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秒かかります。もちろん、システムは異なる数を取得しますが、それでもほぼ同じ桁数である必要があります。




    1. PostgreSQL 9.3:動的ピボットテーブル

    2. アクティビティのonDestroyメソッドにデータを保存します

    3. AccessはODBCデータソースとどのように通信しますか?パート5

    4. MariaDBでのTO_BASE64()のしくみ