Maison > Article > base de données > Résoudre le problème de tri des chaînes Oracle contenant des nombres et des symboles spéciaux
Cet article vous expliquera comment résoudre le problème de tri qui contient des nombres et des symboles spéciaux dans les chaînes Oracle. Récemment, j'ai rencontré une telle demande dans un projet, qui exigeait qu'une certaine communauté soit triée selon la communauté, le bâtiment, le numéro d'unité et le numéro de pièce. Cela semble être une exigence très simple qui peut être résolue avec une instruction SQL. En fait, la routine est très approfondie. Ci-dessous, je vais partager avec vous le problème du tri des nombres et des symboles spéciaux dans les chaînes Oracle. toi.
Description du problème :
Une certaine communauté doit être triée par communauté, bâtiment, numéro d'unité et numéro de pièce, mais elle est triée par description de l'adresse. À l'heure actuelle, comme la chaîne contient des nombres, les résultats suivants sont produits
Le bâtiment n° 1 doit être suivi du bâtiment n° 2, mais le résultat de la requête est le bâtiment n° 10.
Essayez de résoudre
Utilisez une expression régulière pour remplacer
Résultat :
Bien que le tri des numéros de bâtiment soit normal, vous constaterez que le tri des numéros de chambre prête à confusion. Continuez à réfléchir à des moyens
La solution ultime :
Utilisez la fonction de traduction
pour constater que les résultats s'affichent normalement.
Voici comment utiliser la traduction
Grammaire :
TRANSLATE(string,from_str,to_str)
2. Objectif
Renvoie la chaîne après avoir remplacé chaque caractère (toutes les occurrences) dans from_str par le caractère correspondant dans to_str. TRANSLATE est un surensemble des fonctionnalités fournies par REPLACE. Si from_str est plus long que to_str, les caractères supplémentaires dans from_str mais pas dans to_str seront supprimés de la chaîne car ils n'ont aucun caractère de remplacement correspondant. to_str ne peut pas être vide. Oracle interprète les chaînes vides comme NULL, et si un paramètre de TRANSLATE est NULL, le résultat est NULL.
3. Emplacements autorisés
Instructions procédurales et instructions SQL.
4. Exemple
Code SQL
SELECT TRANSLATE('abcdefghij','abcdef','123456') FROM dual; TRANSLATE ( -------------- 123456ghij SELECT TRANSLATE('abcdefghij','abcdefghij','123456') FROM dual; TRANSL ---------- 123456
Syntaxe : TRANSLATE(expr,from,to)
expr : représente une chaîne de caractères, from et to sont en correspondance biunivoque de gauche à droite. S'ils ne peuvent pas correspondre, ils sont considérés comme des valeurs nulles.
Exemple :
select translate('abcbbaadef','ba','#@') from dual (b将被#替代,a将被@替代) select translate('abcbbaadef','bad','#@') from dual (b将被#替代,a将被@替代,d对应的值是空值,将被移走)
Donc : les résultats sont : @#c##@@def et @#c## @@ef
Grammaire : TRANSLATE(expr,from,to)
expr : représente une chaîne de caractères, de et à sont en correspondance biunivoque de gauche à droite. S'ils ne peuvent pas correspondre, ils. sont considérées comme des valeurs vides.
Exemple :
select translate('abcbbaadef','ba','#@') from dual (b将被#替代,a将被@替代) select translate('abcbbaadef','bad','#@') from dual (b将被#替代,a将被@替代,d对应的值是空值,将被移走)
Donc : les résultats sont : @#c##@@def et @#c##@@ef
Les exemples sont les suivants :
Exemple 1 : Convertissez les nombres en 9, les autres lettres majuscules en X, puis revenez.
SELECT TRANSLATE('2KRW229','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') "License"FROM DUAL
Exemple 2 : Conserver les chiffres et supprimer les autres lettres majuscules.
SELECT TRANSLATE('2KRW229','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789') "Translate example"FROM DUAL
Luo Yong a ajouté l'exemple suivant :
Exemple 3 : L'exemple prouve qu'il est traité en fonction des caractères et non des octets . Si to_string a plus de caractères que from_string, les caractères supplémentaires semblent inutiles et ne provoqueront pas d'exception.
SELECT TRANSLATE('我是中国人,我爱中国', '中国', 'China') "Translate example" FROM DUAL
Exemple 4 : L'exemple suivant prouve que si le nombre de caractères from_string est supérieur à to_string, les caractères supplémentaires seront supprimés, c'est-à-dire ina Trois caractères seront supprimés du paramètre char, bien sûr, ils sont sensibles à la casse.
SELECT TRANSLATE('I am Chinese, I love China', 'China', '中国') "Translate example" FROM DUAL
Exemple 5 : L'exemple suivant prouve que si le deuxième paramètre est une chaîne vide, l'intégralité du retour est nul.
SELECT TRANSLATE('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', '') "License" FROM DUAL
Exemple 6 : Lors d'un virement bancaire, je constate souvent que le titulaire du compte n'affiche que le dernier caractère de son nom, et le reste sont remplacés par des astérisques, j'utilise donc Faisons quelque chose de similaire avec traduire.
SELECT TRANSLATE('中国人', substr('中国人',1,length('中国人') - 1), rpad('*',length('中国人'),'*')) "License" FROM DUAL
Si vous rencontrez de tels problèmes, vous pouvez essayer les méthodes ci-dessus.
Recommandations associées :
À propos du résumé d'utilisation de la fonction Contient dans Oracle
Explication détaillée des principes de base d'Oracle requête de pagination
Conseils pour le développement de programmes Oracle
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!