2009-10-15 12 views
5

Tôi đã tìm thấy câu trả lời này hữu ích: Accent and case insensitive COLLATE equivalent in Oracle, nhưng câu hỏi của tôi liên quan đến tìm kiếm LIKE với phiên bản Oracle db phiên bản 9.Sự trùng hợp không phân biệt chữ hoa và chữ thường trong Oracle với LIKE

Tôi đã thử một truy vấn như thế này:

SELECT column_name 
FROM table_name 
WHERE NLSSORT(column_name, 'NLS_SORT = Latin_AI') 
LIKE NLSSORT('%somethingInDB%', 'NLS_SORT = Latin_AI') 

nhưng không có kết quả là bao giờ trả lại.

Tôi tạo ra một chút tập tin Java để kiểm tra:

import org.apache.commons.dbcp.BasicDataSource; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 

public class DbCollationTest 
{ 
public static void main(String[] args) throws SQLException 
{ 
    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver"); 
    dataSource.setUrl("url"); 
    dataSource.setUsername("usr"); 
    dataSource.setPassword("pass"); 

    Connection conn = null; 
    PreparedStatement createStatement = null; 
    PreparedStatement populateStatement = null; 
    PreparedStatement queryStatement = null; 
    PreparedStatement deleteStatement = null; 
    ResultSet rs = null; 

    try 
    { 
    conn = dataSource.getConnection(); 

    createStatement = conn.prepareStatement("CREATE TABLE CollationTestTable (Name varchar(255))"); 
    createStatement.execute(); 

    String[] names = { "pepe", "pépé", "PEPE", "MEME", "mémé", "meme" }; 
    int i = 1; 

    for (String name : names) 
    { 
    populateStatement = conn.prepareStatement("INSERT INTO CollationTestTable VALUES (?)"); 
    populateStatement.setString(1, name); 
    populateStatement.execute(); 
    } 

    queryStatement = conn.prepareStatement("SELECT Name FROM CollationTestTable WHERE NLSSORT(NAME, 'NLS_SORT = Latin_AI') LIKE NLSSORT('%pe%', 'NLS_SORT = Latin_AI')"); 
    rs = queryStatement.executeQuery(); 

    while (rs.next()) 
    { 
    System.out.println(rs.getString(1)); 
    } 

    deleteStatement = conn.prepareStatement("DROP TABLE CollationTestTable"); 
    deleteStatement.execute(); 
    } 
    finally 
    { 
    //DBTools.tidyUp(conn, null, rs); 
    //DBTools.tidyUp(createStatement); 
    //DBTools.tidyUp(populateStatement); 
    //DBTools.tidyUp(queryStatement); 
    //DBTools.tidyUp(deleteStatement); 
    } 
} 
} 

tôi đã không có bất kỳ thành công googling, bất cứ ai có bất kỳ giải pháp?

Tôi muốn thực hiện tìm kiếm trên một phần tên và trả lại kết quả được so khớp bằng chữ hoa và dấu cách.

Trả lời

9

một phương pháp sẽ được sửa đổi thông số phiên của bạn NLS_SORTNLS_COMP:

SQL> SELECT Name FROM CollationTestTable WHERE NAME LIKE '%pe%'; 

NAME 
-------------------------------------------------------------------------------- 
pepe 

SQL> alter session set nls_sort=Latin_AI; 

Session altered 

SQL> alter session set nls_comp=linguistic; 

Session altered 

SQL> SELECT Name FROM CollationTestTable WHERE NAME LIKE '%pe%'; 

NAME 
-------------------------------------------------------------------------------- 
pepe 
pépé 
PEPE 

Như đã trình bày trong another SO, bạn không thể sử dụng toán tử NHƯ với NLSSORT (điều này là bởi vì, NLSSORT returns a string of bytes sẽ được sử dụng để phân loại, và LIKE chỉ hoạt động với chuỗi charater)

Cập nhật: Trong khi đặt tham số NLS sẽ là lựa chọn đầu tiên của tôi, bạn cũng có thể sử dụng chức năng tích hợp để đạt được cùng một resul t. Một vài ví dụ:

SQL> SELECT Name 
    2 FROM CollationTestTable 
    3 WHERE upper(convert(NAME, 'US7ASCII')) 
    4   LIKE upper(convert('%pe%', 'US7ASCII')); 

NAME 
-------------------------------------------------------------------------------- 
pepe 
pépé 
PEPE 

SQL> SELECT Name 
    2 FROM CollationTestTable 
    3 WHERE upper(translate(NAME, 'àâéèêìîòôùûÿ', 'aaeeeiioouuy')) 
    4   LIKE upper(translate('%pe%', 'àâéèêìîòôùûÿ', 'aaeeeiioouuy')); 

NAME 
----------------------------------- 
pepe 
pépé 
PEPE 
+0

Cảm ơn câu trả lời, liệu có làm điều đó mà không thay đổi phiên không? Các truy vấn khác trong cùng một phiên có thể yêu cầu cài đặt NLS gốc. Chúc mừng. –

+0

@Ed: bạn có thể lưu các tham số phiên trước khi chạy truy vấn (chọn * từ nls_session_parameters) sau đó đặt chúng trở lại sau truy vấn. –

+0

Tôi đã thử nghiệm điều này và tất cả đều tốt nhưng bây giờ đã nói rằng giải pháp NLS_SORT và NLS_COMP chỉ được hỗ trợ trong phiên bản 10 r2. Tôi cần hỗ trợ cơ sở dữ liệu Oracle với phiên bản tối thiểu 9. Cách duy nhất để tôi có thể thực hiện trường hợp và tìm kiếm không nhạy cảm là sử dụng chức năng? –