Oracle
 sql >> база данни >  >> RDS >> Oracle

Форматиране на UUID низ без REGEXP_REPLACE и PL/SQL

За съжаление не можете да включите низови литерали в числови формати, в противен случай бихте могли да конвертирате шестнадесетичния низ в число и след това обратно, като вмъкнете литерали във форматната маска на правилните места - но можете да направите това само за дати.

Можете да използвате substr() тъй като позициите са фиксирани. Бяхте загрижени за това

Очевидно не мога да използвам substr и конкатенация, тъй като всеки SUBSTR ще обработва различен SYS_GUID.

Използването на факторинг на подзаявка (известен още като общ израз на таблица/CTE) означава substr() извикванията за ред от този CTE всички виждат един и същ GUID; този метод не генерира нов 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    

Това е много по-бързо от регулярния израз за по-голямо количество данни. С 100 000 стойности в цикъл (в PL/SQL блок, извършване на минимално количество работа вътре в цикъла, за да го направи действително оценяван правилно, и използване на dbms_utility.get_cpu_time за да проверите изминалото време) версията на регулярния израз отнема около 2,51 секунди, докато версията на подниз отнема около 0,29 секунди. Системата ви, разбира се, ще получи различни числа, но те все още трябва да са от приблизително същия порядък.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL*Plus как да приема текстова променлива от подкана?

  2. INITCAP() Функция в Oracle

  3. Това е в подробностите

  4. Грешка в SQL Oracle LEFT JOIN и SUBQUERY:ORA-00905:липсва ключова дума

  5. Грешка 404 не е намерена с EM 12c