sql >> Database >  >> RDS >> Oracle

UUID-string formatteren zonder REGEXP_REPLACE en PL/SQL

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.




  1. Natuurlijk (menselijk alfanumeriek) sorteren in Microsoft SQL 2005

  2. Een telefoonnummer opmaken in SQL Server (T-SQL)

  3. SQL Server 2005 Hoe creëer je een unieke beperking?

  4. IDLE time-outparameter in Oracle