0
votes

Tri de plusieurs types de chiffres et de caractères

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


1 commentaires

Pourquoi voulez-vous A6 avant A50 mais D154 après D153?


4 Réponses :


1
votes

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:

  1. extraire les chiffres de la valeur res_no . J'utilise regexp_replace pour trouver une valeur alphabétique dans res_no et remplacez par la valeur vide. De sorte que la sortie est simplement (coulé comme non signé) numéros. xxx
    1. 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 couvre jusqu'à z, eh bien .. xxx
      1. 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) car je recevais quelques commandes comme le 93, 93 (2 ) l'inverse. xxx

        La requête ci-dessus a généré la sortie suivante: xxx

        maintenant, vous faites la requête comme ci-dessous et obtenez aussi la requête. même résultat: xxx

        commutation de Sélectionnez à Commander par . BTW J'utilise MARIADB 10.3;


3 commentaires

Cette méthode fonctionne mais ne trie pas E18A, E18A1 comme des valeurs @ tcadidot0


E18A1 vient avant E18A?


Ou comme ça? dbfiddle.uk/...



1
votes

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;


2 commentaires

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".



2
votes

Pour que les exemples de données que vous avez postées fonctionnent fonctionnent: xxx pré>

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    |


0 commentaires

2
votes

Cette requête devrait vous donner les résultats souhaités. Les commandes de requête sur 5 choses:

  1. Un jeu de lettres de départ (s'il n'est pas présent, cela sera vide et les valeurs commençant ainsi par les numéros trieront avant celles commençant par des lettres);
  2. le premier numéro de la chaîne (qui peut être précédé par des lettres);
  3. le deuxième ensemble de lettres de la chaîne (si présente);
  4. Un nombre de fuite enfermé entre parenthèses (si présent);
  5. Un numéro de fuite non conçu entre parenthèses (si présent). xxx

    sortie: xxx

    Démo sur dbfiddle


1 commentaires

@Simba pas de soucis. Je suis heureux d'avoir pu aider.