Je kunt helaas geen letterlijke tekenreeksen in getalnotaties opnemen, anders zou je de hexadecimale tekenreeks kunnen converteren naar een getal en dan weer terug, door letterlijke waarden in het formaatmasker op de juiste plaatsen in te voegen - maar dat kan alleen voor datums.
U kunt substr()
. gebruiken aangezien de posities vast staan. Je was bezorgd dat
Het is duidelijk dat ik substr en concatenatie niet kan gebruiken omdat elke SUBSTR een andere SYS_GUID zou verwerken.
Het gebruik van subquery-factoring (ook bekend als een algemene tabeluitdrukking/CTE) betekent dat de substr()
oproepen voor een rij van die CTE zien allemaal dezelfde GUID; deze methode genereert niet voor elke een nieuwe 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
Dat is een stuk sneller dan de regex op een grotere hoeveelheid gegevens. Met 100000 waarden in een lus (in een PL/SQL-blok, een minimale hoeveelheid werk binnen de lus doen om het daadwerkelijk correct te laten evalueren, en dbms_utility.get_cpu_time
gebruiken om de verstreken tijd te controleren) duurt de regex-versie ongeveer 2,51 seconden, terwijl de substringversie ongeveer 0,29 seconden duurt. Je systeem krijgt natuurlijk verschillende aantallen, maar het zou nog steeds ongeveer dezelfde orde van grootte moeten zijn.