L'Accent et la casse de classement dans Oracle avec COMME
J'ai trouvé cette réponse utile:
L'Accent et la casse RASSEMBLER équivalent dans Oracle, mais ma question est au sujet COMME la recherche, avec une version 9 db Oracle.
J'ai essayé une requête comme ceci:
SELECT column_name
FROM table_name
WHERE NLSSORT(column_name, 'NLS_SORT = Latin_AI')
LIKE NLSSORT('%somethingInDB%', 'NLS_SORT = Latin_AI')
mais aucun résultat n'est jamais revenu.
J'ai créé un petit fichier Java pour 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);
}
}
}
Je n'ai pas eu tout le succès googler, quelqu'un a une solutions?
Je veux effectuer une recherche sur une partie du nom et de retourner des résultats qui sont appariés en utilisant les cas d'accentuation et de l'insensibilité.
OriginalL'auteur Ed . | 2009-10-15
Vous devez vous connecter pour publier un commentaire.
une méthode serait de modifier vos paramètres de session
NLS_SORT
etNLS_COMP
:Comme indiqué dans l'autre, de SORTE, vous ne pouvez pas utiliser l'opérateur LIKE avec
NLSSORT
(c'est parce que, NLSSORT renvoie une chaîne d'octets qui sera utilisé pour le tri, et COMME fonctionne uniquement avec le personnage de chaînes de caractères)Mise à jour: lors du réglage de la NLS paramètres serait mon premier choix, vous pouvez également utiliser les fonctions intégrées pour obtenir le même résultat. Quelques exemples:
vous pourriez enregistrer les paramètres de la session avant d'exécuter la requête (select * from nls_session_parameters), puis les mettre à revenir après la requête.
J'ai testé cette et toutes l'air bien mais je me dit maintenant que NLS_SORT et NLS_COMP solution est uniquement pris en charge dans la version 10 r2. J'ai besoin de soutien des bases de données Oracle avec min la version 9. Est la seule façon que je peux faire l'affaire et insensible aux accents de recherche est l'utilisation de fonctions?
NLS_SORT=linguistique semble être un 10g fonctionnalité. Vous pouvez toujours utiliser la deuxième méthode (fonctions SQL) dans 9i.
OriginalL'auteur Vincent Malgrat