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.
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. –
@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. –
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? –