Comment trier une table avec différents nombres et caractères. La colonne de ma table est
p>
REGEXP ('^[0-9]') CAST(res_no AS UNSIGNED) REGEXP_SUBSTR(res_no, '(^[a-zA-Z]+)|([a-zA-Z]$)') CAST(REGEXP_SUBSTR(res_no, '(^[0-9]+)|([0-9]+$)') AS UNSIGNED
4 Réponses :
C'est assez délicat pour moi, mais je suis capable d'obtenir le résultat souhaité avec cette requête. Pourrait ne pas être la solution mais j'espère avoir des idées de cela.
Mon approche est de: p>
res_no code>. J'utilise regexp_replace code> pour trouver une valeur alphabétique dans res_no code> et remplacez par la valeur vide. De sorte que la sortie est simplement (coulé comme non signé) numéros. Li>
ol> xxx pré>
- Attribuez une valeur de numéro de rangée personnalisée par chiffres comme 1, A comme 2, B comme 3 .. et ainsi de suite. Donc, si votre
res_no code> couvre jusqu'à z, eh bien .. li>
ol> xxx pré>
- La dernière partie consiste à effectuer la commande basée sur ROWNUM, puis de numéros et j'ai ajouté une dernière condition
longueur (res_no) code> car je recevais quelques commandes comme le 93, 93 (2 ) code> l'inverse. li>
ol> xxx pré> La requête ci-dessus a généré la sortie suivante: p> xxx pré> maintenant, vous faites la requête comme ci-dessous et obtenez aussi la requête. même résultat: p> xxx pré> commutation de Sélectionnez CODE> à Commander par code>.
BTW J'utilise MARIADB 10.3; P> P>
Cette méthode fonctionne mais ne trie pas E18A, E18A1 comme des valeurs @ tcadidot0
E18A1 vient avant E18A?
Ou comme ça? dbfiddle.uk/...
Si je comprends correctement, vous voulez d'abord des chiffres de premier plan par numéro et le reste par ordre alphabétiquement.
La requête suivante fait ceci: p>
select t.* from t order by (res_no + 0) > 0 desc, -- numbers first (res_no + 0), (case when res_no like 'A%' then res_no end) desc, res_no;
J'ai besoin de A6 pour venir avant A50, A51A, A141, A141 (25) .. @ Gordon Linoff
@Simba. . . Quelle est la règle pour cela? Il ne semble pas s'appliquer aux enregistrements "D".
Pour que les exemples de données que vous avez postées fonctionnent fonctionnent: voir le Demo .
Résultats: P> | res_no |
| -------- |
| 37 |
| 39A |
| 91G |
| 93 |
| 93(2) |
| 105 FF |
| 113 |
| 114A |
| A6 |
| A50 |
| A51A |
| A141 |
| A141(25) |
| A143B |
| B14 |
| C16 |
| C40FF |
| D153(1) |
| D154 |
| D154a |
| E18A |
| E18A1 |
Cette requête devrait vous donner les résultats souhaités. Les commandes de requête sur 5 choses:
sortie: p> Démo sur dbfiddle P> P>
@Simba pas de soucis. Je suis heureux d'avoir pu aider.
Pourquoi voulez-vous A6 avant A50 mais D154 après D153?