Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách giải quyết cụm từ thông dụng SQL Server trong T-SQL?

Rất tiếc, bạn sẽ không thể di chuyển (các) hàm CLR của mình sang SQL Azure. Bạn sẽ cần sử dụng các hàm chuỗi bình thường (PATINDEX, CHARINDEX, LIKE, v.v.) hoặc thực hiện các thao tác này bên ngoài cơ sở dữ liệu.

CHỈNH SỬA Thêm một số thông tin cho các ví dụ được thêm vào câu hỏi.

Địa chỉ email

Điều này luôn gây tranh cãi vì mọi người không đồng ý về phiên bản RFC mà họ muốn hỗ trợ. Ví dụ:bản gốc không hỗ trợ dấu nháy đơn (hoặc ít nhất mọi người nhấn mạnh rằng nó không có - tôi chưa đào nó lên từ kho lưu trữ và tự đọc nó, phải thừa nhận), và nó phải được mở rộng khá thường xuyên cho mới TLD (một lần cho TLD 4 chữ cái như .info, sau đó một lần nữa cho TLD 6 chữ cái như .museum). Tôi thường nghe những người khá am hiểu nói rằng việc xác thực e-mail hoàn hảo là không thể, và trước đây đã từng làm việc cho một nhà cung cấp dịch vụ e-mail, tôi có thể nói với bạn rằng đó là một mục tiêu liên tục di chuyển. Nhưng đối với các cách tiếp cận đơn giản nhất, hãy xem câu hỏi Xác thực email TSQL (không có regex ) .

Một chữ số

Có lẽ là một trong những cách dễ nhất:

WHERE @s LIKE '[0-9]';

Số thẻ tín dụng

Giả sử bạn loại bỏ dấu gạch ngang và dấu cách, điều này bạn nên làm trong mọi trường hợp. Lưu ý rằng đây không phải là một kiểm tra thực tế đối với thuật toán số thẻ tín dụng để đảm bảo rằng bản thân số đó thực sự hợp lệ, chỉ là nó tuân theo định dạng chung (AmEx =15 chữ số bắt đầu bằng số 3, còn lại là 16 chữ số - Visa bắt đầu bằng 4, MasterCard bắt đầu bằng 5, Khám phá bắt đầu bằng 6 và tôi nghĩ có một thẻ bắt đầu bằng 7 (mặc dù đó có thể chỉ là thẻ quà tặng của một số loại)):

WHERE @s + ' ' LIKE '[3-7]'+ REPLICATE('[0-9]', 14) + '[0-9 ]';

Nếu bạn muốn chính xác hơn một chút với cái giá phải trả là dài dòng, bạn có thể nói:

WHERE (LEN(@s) = 15 AND @s LIKE '3'     + REPLICATE('[0-9]', 14))
   OR (LEN(@s) = 16 AND @s LIKE '[4-7]' + REPLICATE('[0-9]', 15));

Số điện thoại của Hoa Kỳ

Một lần nữa, giả sử bạn sẽ loại bỏ dấu ngoặc đơn, dấu gạch ngang và dấu cách trước. Khá chắc chắn rằng mã vùng của Hoa Kỳ không thể bắt đầu bằng số 1; nếu có các quy tắc khác, tôi không biết về chúng.

WHERE @s LIKE '[2-9]' + REPLICATE('[0-9]', 9);

-----

Tôi sẽ không đi xa hơn, bởi vì rất nhiều biểu thức khác mà bạn đã xác định có thể được ngoại suy từ phần trên. Hy vọng rằng điều này mang lại cho bạn một khởi đầu. Bạn sẽ có thể Google cho một số người khác để xem những người khác đã sao chép các mẫu với T-SQL như thế nào. Một số trong số chúng (như các ngày trong tuần) có thể chỉ được kiểm tra dựa trên bảng - có vẻ như quá mức cần thiết để thực hiện đối sánh mẫu xâm lấn cho một bộ 7 giá trị có thể. Tương tự như vậy với danh sách 1000 số hoặc năm, đây là những thứ sẽ dễ dàng hơn nhiều (và có lẽ là hiệu quả hơn) để kiểm tra xem giá trị số có trong một bảng hay không thay vì chuyển đổi nó thành một chuỗi và xem nó có khớp với một số mẫu hay không.

Tôi sẽ nói lại rằng rất nhiều điều này sẽ tốt hơn nhiều nếu bạn có thể làm sạch và xác thực dữ liệu trước khi nó được đưa vào cơ sở dữ liệu ngay từ đầu. Bạn nên cố gắng thực hiện điều này bất cứ khi nào có thể, bởi vì không có CLR, bạn không thể thực hiện RegEx mạnh mẽ bên trong SQL Server.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể kết nối với SQL Server bằng PHP

  2. Kiểm tra phiên bản SSIS

  3. SQL để tạo XML dữ liệu bảng

  4. Cách sử dụng tìm kiếm ngữ nghĩa trong SQL Server

  5. SQL Server 2017:Các tính năng có sẵn trên Linux