sql >> Databasteknik >  >> RDS >> Oracle

Formatera UUID-sträng utan REGEXP_REPLACE och PL/SQL

Du kan tyvärr inte inkludera strängliteraler i talformat, annars kan du konvertera hexsträngen till ett tal och sedan tillbaka igen, infoga bokstaver i formatmasken på rätt ställen - men det kan du bara göra för datum.

Du kan använda substr() eftersom positionerna är fasta. Du var orolig för det

Uppenbarligen kan jag inte använda substr och sammanlänkning eftersom varje SUBSTR skulle bearbeta olika SYS_GUID.

Att använda subquery factoring (a.ka. ett vanligt tabelluttryck/CTE) innebär substr() uppmanar till en rad från att CTE alla ser samma GUID; den här metoden genererar inte ett nytt SYS_GUID för var och en.

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 är mycket snabbare än regex på en större mängd data. Med 100 000 värden i en loop (i ett PL/SQL-block, gör en minimal mängd arbete inuti slingan för att den faktiskt ska utvärderas korrekt, och använder dbms_utility.get_cpu_time för att kontrollera förfluten tid) tar den regex-versionen cirka 2,51 sekunder, medan versionen av delsträngen tar cirka 0,29 sekunder. Ditt system kommer naturligtvis att få olika nummer, men det bör fortfarande vara ungefär samma storleksordning.




  1. PostgreSQL-motsvarighet för TOP n WITH TIES:LIMIT med slipsar?

  2. TIMEFROMPARTS() Exempel i SQL Server (T-SQL)

  3. SQL Server Join Estimation med Histogram Coarse Alignment

  4. SQLite - ORDER BY RAND()