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

Résoudre le problème de tri des chaînes Oracle contenant des nombres et des symboles spéciaux

小云云
小云云original
2017-12-11 13:19:313275parcourir

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn