Sayangnya, Anda tidak dapat menyertakan literal string dalam format angka, jika tidak, Anda dapat mengonversi string hex ke angka lalu kembali lagi, menyisipkan literal dalam format mask di tempat yang tepat - tetapi Anda hanya dapat melakukannya untuk tanggal.
Anda dapat menggunakan substr()
karena posisinya sudah pasti. Anda khawatir bahwa
Jelas saya tidak dapat menggunakan substr dan penggabungan karena setiap SUBSTR akan memproses SYS_GUID yang berbeda.
Menggunakan pemfaktoran subquery (alias ekspresi tabel umum/CTE) berarti substr()
panggilan untuk baris dari CTE itu semua melihat GUID yang sama; metode ini tidak menghasilkan SYS_GUID baru untuk masing-masing metode.
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
Itu jauh lebih cepat daripada regex pada jumlah data yang lebih besar. Dengan 100000 nilai dalam satu loop (dalam blok PL/SQL, lakukan sedikit pekerjaan di dalam loop untuk membuatnya benar-benar mengevaluasi dengan benar, dan menggunakan dbms_utility.get_cpu_time
untuk memeriksa waktu yang telah berlalu) versi regex membutuhkan waktu sekitar 2,51 detik, sedangkan versi substring membutuhkan waktu sekitar 0,29 detik. Sistem Anda akan mendapatkan angka yang berbeda tentu saja, tetapi seharusnya masih dalam urutan besarnya yang sama.