2009-10-15 7 views
5

Ich habe diese Antwort nützlich gefunden: Accent and case insensitive COLLATE equivalent in Oracle, aber meine Frage bezieht sich auf LIKE Suche mit einer Version 9 Oracle db.Akzent und case insensitive Kollation in Oracle mit LIKE

Ich habe eine Abfrage wie folgt versucht:

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

aber keine Ergebnisse jemals zurückgegeben werden.

habe ich eine kleine Java-Datei-Test:

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

Ich habe keinen Erfolg hatte googeln, jemand irgendwelche Lösungen?

Ich möchte eine Suche nach einem Teil eines Namens durchführen und Ergebnisse zurückgeben, die mit Groß-/Kleinschreibung und Akzent-Unempfindlichkeit übereinstimmen.

Antwort

9

eine Methode wäre, um Ihre Session-Parameter NLS_SORT und NLS_COMP zu ändern:

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 

Wie in another SO gezeigt, können Sie nicht den LIKE-Operator mit NLSSORT verwenden können (weil, NLSSORT returns a string of bytes die für die Sortierung verwendet werden soll, und LIKE funktioniert nur mit Zeichenfolgen)

Update: Während der Einstellung der NLS-Parameter wäre meine erste Wahl, könnten Sie auch integrierte Funktionen verwenden, um das gleiche Ergebnis zu erreichen t. Ein paar Beispiele:

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

Danke für die Antwort, ist es trotzdem, es zu tun, ohne die Sitzung zu ändern? Andere Abfragen in derselben Sitzung erfordern möglicherweise die ursprünglichen NLS-Einstellungen. Prost. –

+0

@Ed: Sie können die Sitzungsparameter speichern, bevor Sie die Abfrage ausführen (wählen Sie * aus nls_session_parameters aus) und dann nach der Abfrage zurückstellen. –

+0

Ich habe dies getestet und alles sah gut aus, aber jetzt wird mir gesagt, dass NLS_SORT und NLS_COMP Lösung nur in Version 10 R2 unterstützt wird. Ich muss Oracle-Datenbanken mit mindestens Version 9 unterstützen. Ist die einzige Möglichkeit, die Groß-/Kleinschreibung und akzentunempfindliche Suche zu verwenden, Funktionen zu verwenden? –