Oracle中使用LIKE进行重音和不区分大小写的排序规则

我发现这个答案很有用: Oracle中的Accent和不区分大小写的COLLATE ,但我的问题是关于使用版本9 Oracle db进行搜索。

我尝试过这样的查询:

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

但没有结果返回。

我创建了一个小的Java文件来测试:

 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); } } } 

我没有任何成功的谷歌搜索,任何人都有任何解决方案?

我想对名称的一部分执行搜索并返回使用大小写和重音不敏感性匹配的结果。

一种方法是修改会话参数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 

如另一个SO所示,您不能将LIKE运算符与NLSSORT一起NLSSORT (这是因为, NLSSORT返回将用于排序的字节字符串 ,而LIKE仅适用于字符串)

更新:设置NLS参数将是我的第一选择,您也可以使用内置函数来实现相同的结果。 几个例子:

 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