sql >> Database teknologi >  >> RDS >> Oracle

Formatering af UUID-streng uden REGEXP_REPLACE og PL/SQL

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.




  1. Sådan slipper du en begrænsning i SQL Server (T-SQL)

  2. Automatiseret test af opgraderingsprocessen til MySQL/MariaDB/Percona Server

  3. Bedste måde at undgå duplikatindtastning i mysql-databasen

  4. Kumulativ total i MS SQL server