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

Tìm kiếm không phân biệt chữ hoa chữ thường trong Oracle

Có 3 cách chính để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường trong Oracle mà không cần sử dụng các chỉ mục toàn văn.

Cuối cùng thì phương pháp nào bạn chọn là tùy thuộc vào hoàn cảnh cá nhân của bạn; điều chính cần nhớ là để cải thiện hiệu suất, bạn phải lập chỉ mục chính xác cho tìm kiếm không phân biệt chữ hoa chữ thường.

1. Đặt cột của bạn và chuỗi của bạn giống hệt nhau.

Bạn có thể buộc tất cả dữ liệu của mình phải giống nhau bằng cách sử dụng UPPER() hoặc LOWER() :

select * from my_table where upper(column_1) = upper('my_string');

hoặc

select * from my_table where lower(column_1) = lower('my_string');

Nếu column_1 không được lập chỉ mục trên upper(column_1) hoặc lower(column_1) , nếu thích hợp, điều này có thể buộc phải quét toàn bộ bảng. Để tránh điều này, bạn có thể tạo chỉ mục dựa trên chức năng.

create index my_index on my_table ( lower(column_1) );

Nếu bạn đang sử dụng LIKE thì bạn phải nối một % xung quanh chuỗi bạn đang tìm kiếm.

select * from my_table where lower(column_1) LIKE lower('my_string') || '%';

SQL Fiddle này giải thích những gì xảy ra trong tất cả các truy vấn này. Lưu ý các Kế hoạch Giải thích, cho biết khi nào một chỉ mục đang được sử dụng và khi nào thì không.

2. Sử dụng biểu thức chính quy.

Từ Oracle 10g trở đi REGEXP_LIKE() có sẵn. Bạn có thể chỉ định _match_parameter_ 'i' , để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường.

Để sử dụng điều này làm toán tử bình đẳng, bạn phải chỉ định điểm bắt đầu và kết thúc của chuỗi, được biểu thị bằng carat và ký hiệu đô la.

select * from my_table where regexp_like(column_1, '^my_string$', 'i');

Để thực hiện tương đương với LIKE, chúng có thể bị xóa.

select * from my_table where regexp_like(column_1, 'my_string', 'i');

Hãy cẩn thận với điều này vì chuỗi của bạn có thể chứa các ký tự sẽ được công cụ biểu thức chính quy diễn giải theo cách khác.

SQL Fiddle này hiển thị cho bạn cùng một đầu ra ví dụ ngoại trừ việc sử dụng REGEXP_LIKE ().

3. Thay đổi nó ở cấp phiên.

Tham số NLS_SORT điều chỉnh trình tự đối chiếu để đặt hàng và các toán tử so sánh khác nhau, bao gồm = và thích. Bạn có thể chỉ định một mã nhị phân, không phân biệt chữ hoa chữ thường, sắp xếp bằng cách thay đổi phiên. Điều này có nghĩa là mọi truy vấn được thực hiện trong phiên đó sẽ thực hiện các tham số không phân biệt chữ hoa chữ thường.

alter session set nls_sort=BINARY_CI

Có rất nhiều thông tin bổ sung về sắp xếp ngôn ngữ và tìm kiếm chuỗi nếu bạn muốn chỉ định một ngôn ngữ khác hoặc thực hiện tìm kiếm không phân biệt trọng âm bằng BINARY_AI.

Bạn cũng sẽ cần thay đổi tham số NLS_COMP; để trích dẫn:

Các toán tử và mệnh đề truy vấn chính xác tuân theo tham số NLS_SORT phụ thuộc vào giá trị của tham số NLS_COMP. Nếu một toán tử hoặc mệnh đề không tuân theo giá trị NLS_SORT, như được xác định bởi NLS_COMP, đối chiếu được sử dụng là BINARY.

Giá trị mặc định của NLS_COMP là BINARY; nhưng, LINGUISTIC chỉ định rằng Oracle nên chú ý đến giá trị của NLS_SORT:

So sánh cho tất cả các hoạt động SQL trong mệnh đề WHERE và trong PL / SQLblocks nên sử dụng sắp xếp ngôn ngữ được chỉ định trong NLS_SORTparameter. Để cải thiện hiệu suất, bạn cũng có thể xác định chỉ mục ngôn ngữ trên cột mà bạn muốn so sánh ngôn ngữ.

Vì vậy, một lần nữa, bạn cần thay đổi phiên

alter session set nls_comp=LINGUISTIC

Như đã lưu ý trong tài liệu, bạn có thể muốn tạo một chỉ mục ngôn ngữ để cải thiện hiệu suất

create index my_linguistc_index on my_table 
   (NLSSORT(column_1, 'NLS_SORT = BINARY_CI'));


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bất kỳ tác động hiệu suất nào trong Oracle khi sử dụng LIKE 'string' vs ='string'?

  2. 2 cách để định dạng một số với Zeros hàng đầu trong Oracle

  3. Đặc vụ bị chặn

  4. Thử thách kiểm tra cơ sở dữ liệu Oracle - So sánh dữ liệu lược đồ

  5. Số lượt chọn (1) từ tên_bảng trên bất kỳ bảng cơ sở dữ liệu nào có nghĩa là gì?