Du kan desværre ikke inkludere streng-literaler i talformater, ellers kan du konvertere hex-strengen til et tal og så tilbage igen ved at indsætte bogstaver i formatmasken de rigtige steder - men det kan du kun gøre for datoer.
Du kan bruge substr()
da positionerne er faste. Det var du bekymret for
Jeg kan naturligvis ikke bruge substr og sammenkædning, da hver SUBSTR ville behandle et andet SYS_GUID.
Brug af subquery factoring (a.ka. et almindeligt tabeludtryk/CTE) betyder substr()
opfordrer til en række fra at CTE alle ser den samme GUID; denne metode genererer ikke et nyt SYS_GUID for hver enkelt.
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
Det er meget hurtigere end regex på en større mængde data. Med 100.000 værdier i en løkke (i en PL/SQL-blok, laver en minimal mængde arbejde inde i løkken for at få den faktisk til at evaluere korrekt, og ved hjælp af dbms_utility.get_cpu_time
for at kontrollere den forløbne tid) tager regex-versionen ca. 2,51 sekunder, mens substring-versionen tager ca. 0,29 sekunder. Dit system vil selvfølgelig få forskellige tal, men det bør stadig være af samme størrelsesorden.