Rất tiếc, bạn không thể bao gồm các ký tự chuỗi ở các định dạng số, nếu không, bạn có thể chuyển đổi chuỗi hex thành một số rồi quay lại, chèn các ký tự vào mặt nạ định dạng ở đúng vị trí - nhưng bạn chỉ có thể làm điều đó cho các ngày.
Bạn có thể sử dụng substr()
kể từ khi các vị trí được cố định. Bạn lo ngại rằng
Rõ ràng là tôi không thể sử dụng substr và nối vì mỗi SUBSTR sẽ xử lý một SYS_GUID khác nhau.
Sử dụng tính toán truy vấn con (còn gọi là biểu thức bảng chung / CTE) có nghĩa là substr()
các lệnh gọi cho một hàng từ CTE đó đều thấy cùng một GUID; phương pháp này không tạo SYS_GUID mới cho mỗi phương thức.
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
Đó là nhanh hơn rất nhiều so với regex trên một lượng dữ liệu lớn hơn. Với 100000 giá trị trong một vòng lặp (trong một khối PL / SQL, thực hiện một lượng công việc tối thiểu bên trong vòng lặp để làm cho nó thực sự được đánh giá đúng cách và sử dụng dbms_utility.get_cpu_time
để kiểm tra thời gian đã trôi qua) phiên bản regex mất khoảng 2,51 giây, trong khi phiên bản chuỗi con mất khoảng 0,29 giây. Tất nhiên, hệ thống của bạn sẽ nhận được các con số khác nhau, nhưng nó vẫn phải có cùng độ lớn.