sql >> Databáze >  >> RDS >> Oracle

Formátování řetězce UUID bez REGEXP_REPLACE a PL/SQL

Řetězcové literály bohužel nemůžete zahrnout do číselných formátů, jinak byste mohli převést hexadecimální řetězec na číslo a pak zase zpět a vložit literály do masky formátu na správná místa – ale můžete to udělat pouze pro data.

Můžete použít substr() protože pozice jsou pevné. Měli jste obavy

Je zřejmé, že nemohu použít substr a zřetězení, protože každý SUBSTR by zpracoval jiný SYS_GUID.

Použití faktoringu poddotazů (aka běžný tabulkový výraz/CTE) znamená substr() volá po řádku z tohoto CTE, všichni vidí stejný GUID; tato metoda negeneruje nový SYS_GUID pro každý z nich.

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    

To je mnohem rychlejší než regulární výraz na větším množství dat. S 100 000 hodnotami ve smyčce (v bloku PL/SQL s minimálním množstvím práce uvnitř smyčky, aby se skutečně správně vyhodnotila, a pomocí dbms_utility.get_cpu_time pro kontrolu uplynulého času) verze regulárního výrazu trvá asi 2,51 sekundy, zatímco verze podřetězce trvá asi 0,29 sekundy. Váš systém bude mít samozřejmě různá čísla, ale pořád by to mělo být přibližně stejného řádu.




  1. Jak ladit ORA-01775:smyčkový řetězec synonym?

  2. Platné náhrady formátovaných řetězců pro funkci SQLite Strftime().

  3. Jak psát vybraná prohlášení

  4. Obsahuje MS SQL Server hranice rozsahu?