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

CHARINDEX () so với PATINDEX () trong SQL Server - Sự khác biệt là gì?

Trong SQL Server, bạn có thể sử dụng CHARINDEX() hoặc hàm PATINDEX() hàm để tìm một chuỗi trong một chuỗi. Đây là các hàm chuỗi Transact-SQL và chúng cũng có sẵn trên cơ sở dữ liệu Azure.

Bề ngoài, các chức năng này có vẻ hoạt động giống hệt nhau và trong nhiều trường hợp, bạn có thể sử dụng bất kỳ chức năng nào bạn muốn sử dụng.

Tuy nhiên, có một số điểm khác biệt có thể quyết định chức năng nào bạn quyết định sử dụng trong một số trường hợp nhất định. Những điều này có thể được tóm tắt như sau:

  • PATINDEX() cho phép bạn sử dụng các ký tự đại diện để tìm kiếm các mẫu. CHARINDEX() không.
  • CHARINDEX() chấp nhận đối số thứ ba cho phép bạn chỉ định vị trí bắt đầu của tìm kiếm. PATINDEX() không.

Chi tiết hơn về những điểm này bên dưới.

Định nghĩa

Trước tiên, hãy xem định nghĩa chính thức hoặc từng chức năng.

CHARINDEX()
Tìm kiếm một biểu thức ký tự bên trong một biểu thức ký tự thứ hai, trả về vị trí bắt đầu của biểu thức đầu tiên nếu được tìm thấy.
PATINDEX()
Trả về vị trí bắt đầu của lần xuất hiện đầu tiên của một mẫu trong một biểu thức được chỉ định hoặc các số không nếu không tìm thấy mẫu trên tất cả các kiểu dữ liệu ký tự và văn bản hợp lệ.

Cú pháp

Và đây là cú pháp chính thức của từng hàm.

CHARINDEX ()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINDEX ()

PATINDEX ( '%pattern%' , expression )

Vì vậy, cả hai hàm đều cho phép bạn tìm kiếm một biểu thức ký tự, tuy nhiên PATINDEX() chức năng cho phép bạn tìm kiếm một mẫu . Vì vậy, đây là chức năng bổ sung mà bạn không có với CHARINDEX() hàm số. Với PATINDEX() bạn có thể sử dụng các ký tự đại diện để chỉ định một mẫu để tìm kiếm, điều này có thể rất hữu ích trong một số trường hợp.

Tuy nhiên, CHARINDEX() chấp nhận ba đối số trong khi PATINDEX() chỉ chấp nhận hai. CHARINDEX() hàm chấp nhận đối số thứ ba tùy chọn cho phép bạn chỉ định vị trí bắt đầu của tìm kiếm. Nói cách khác, CHARINDEX() hàm cho phép bạn chỉ trả về những kết quả phù hợp xảy ra sau một thời điểm nhất định trong chuỗi.

Ví dụ

Dưới đây là các ví dụ chứng minh chức năng bổ sung được cung cấp bởi mỗi chức năng.

CHARINDEX ()

Ở đây, tôi cung cấp đối số thứ ba để chỉ định một vị trí để bắt đầu tìm kiếm. Trong trường hợp này, nó sẽ bỏ qua lần xuất hiện đầu tiên của Bob và nó sẽ trả về vị trí của lần xuất hiện thứ hai.

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Kết quả:

17

Vì vậy, như đã đề cập, bạn không thể làm điều này với PATINDEX() bởi vì nó không chấp nhận tham số thứ ba đó.

PATINDEX ()

Bây giờ đây là một ví dụ về điều gì đó bạn có thể làm với PATINDEX() điều mà bạn không thể làm với CHARINDEX() . Trong ví dụ này, chúng tôi sử dụng các ký tự đại diện để tìm kiếm một mẫu:

SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Kết quả:

11

Trong trường hợp này, chúng tôi sử dụng dấu phần trăm (% ) là các ký tự đại diện để chỉ ra rằng bất kỳ số lượng ký tự nào cũng có thể tiếp tục và thành công chuỗi tìm kiếm của chúng tôi. Chúng tôi cũng sử dụng dấu gạch dưới (_ ) là ký tự đại diện cho bất kỳ đơn lẻ nào nhân vật.

Kết luận

Vì vậy, trong khi cả hai CHARINDEX()PATINDEX() cung cấp chức năng tương tự và trong nhiều trường hợp, một trong hai có thể được sử dụng thay vì cái kia, đôi khi bạn cần sử dụng cái này thay cho cái kia.

Cụ thể, bạn sẽ sử dụng CHARINDEX() khi bạn muốn chỉ định vị trí bắt đầu trong chuỗi để tìm kiếm. Và bạn sẽ sử dụng PATINDEX() bất cứ khi nào bạn cần chỉ định một mẫu để tìm kiếm.


  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ái niệm cơ bản về tự động hóa tác vụ SQL Server

  2. Nhiều chỉ mục so với nhiều cột

  3. Cách lấy danh sách các ràng buộc kiểm tra được bật / tắt trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 86

  4. SELECT max (x) trả về null; làm thế nào tôi có thể làm cho nó trả về 0?

  5. Cách đơn giản để chuyển đổi các cột và hàng trong SQL?