Tôi sẽ rất ngạc nhiên nếu bạn có thể phát hiện ra bất kỳ sự khác biệt nào giữa WHERE col LIKE '[0-9]'
và bất kỳ phương pháp nào khác mà bạn nghĩ ra. Nhưng tôi đồng ý với Denis, hãy loại bỏ điều đó trong một hàm để bạn sử dụng cùng một lần kiểm tra nhất quán trong tất cả mã của mình (hoặc ít nhất, nếu bạn đang tránh các UDF vì quá trình quét lớn, v.v., hãy đặt một điểm đánh dấu vào mã của bạn. giúp bạn dễ dàng thay đổi trên diện rộng sau này).
Điều đó nói rằng, bạn chắc chắn sẽ thấy nhiều hiệu suất đạt được chỉ bằng cách sử dụng UDF vô hướng hơn là phương pháp bạn sử dụng để phân tích cú pháp bên trong hàm. Bạn thực sự nên so sánh hiệu suất của UDF với việc thực hiện điều đó nội tuyến bằng cách sử dụng CASE
. ví dụ:
SELECT Postal = CONVERT(INT, CASE WHEN SUBSTRING(postal,2,1) LIKE '[0-9]'
THEN SUBSTRING(postal, 2,1) END)
FROM ...
Điều này sẽ mang lại NULL
nếu ký tự không phải là số.
Nếu bạn chỉ xử lý việc kiểm tra các biến cục bộ, thì việc bạn sử dụng phương pháp phân tích cú pháp nào sẽ không thành vấn đề và tốt hơn hết bạn nên tập trung nỗ lực tối ưu hóa của mình vào nơi khác.
CHỈNH SỬA thêm đề xuất vào JOIN
đã được chứng minh mệnh đề. Điều này có thể dẫn đến việc quét ít liên tục hơn nhưng dễ đọc hơn rất nhiều (ít lệnh gọi chuỗi con hơn nhiều, v.v.):
;WITH v AS
(
SELECT /* other columns, */ patientPostal,
ss = SUBSTRING(v.patientPostal,2,1),
FROM [whatever table is aliased v in current query]
)
SELECT /* column list */
FROM [whatever table is aliased z in current query]
INNER JOIN v ON z.postal = CONVERT(INT, CASE
WHEN v.ss = '0' THEN ss
WHEN v.ss LIKE '[1-9]' THEN LEFT(v.patientPostal, 3)
END);