2009-10-15 12 views
5

He encontrado esta respuesta útil: Accent and case insensitive COLLATE equivalent in Oracle, pero mi pregunta es con respecto a LIKE buscando con una versión 9 Oracle db.Collation insensible a mayúsculas y minúsculas en Oracle con LIKE

que han intentado una consulta como esta:

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

pero se devuelven cada vez hay resultados.

he creado un pequeño archivo de Java para probar:

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

no he tenido ningún éxito buscando en Google, cualquier persona tiene alguna solución?

Deseo realizar una búsqueda de parte de un nombre y devolver resultados que coinciden utilizando la insensibilidad de mayúsculas y minúsculas.

Respuesta

9

un método sería modificar los parámetros de la sesión NLS_SORT y NLS_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 

Como se muestra en another SO, no se puede utilizar el operador LIKE con NLSSORT (esto se debe a que, NLSSORT returns a string of bytes que será utilizado para la clasificación, y LIKE solo funciona con cadenas de caracteres)

Actualización: Si bien la configuración de los parámetros NLS sería mi primera opción, también podría utilizar las funciones incorporadas para lograr el mismo resultado t. Un par de ejemplos:

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

Gracias por la respuesta, ¿hay alguna forma de hacerlo sin alterar la sesión? Otras consultas en la misma sesión pueden requerir la configuración original de NLS. Aclamaciones. –

+0

@Ed: puede guardar los parámetros de la sesión antes de ejecutar la consulta (seleccione * desde nls_session_parameters) y luego volver a colocarlos después de la consulta. –

+0

He estado probando esto y todo se veía bien, pero ahora me dicen que la solución NLS_SORT y NLS_COMP solo se admite en la versión 10 r2. Necesito apoyar las bases de datos de Oracle con la versión mínima 9. ¿Es la única manera en que puedo realizar el caso y la búsqueda insensible a los acentos está usando funciones? –

Cuestiones relacionadas