0
votes

Sort String contenant une combinaison de caractères, d'une période et d'un numéro en ordre décroissant dans Oracle

J'essaie de trier un champ de chaîne en ordre décroissant.

Règles de tri: p>

  • 'P' et 'S' resteront constants tout le temps li>
  • nulls devrait être le dernier li>
  • Le caractère entier doit être trié dans l'ordre décroissant en commençant par la première commande de préférences aux caractères avant «P», puis les caractères après «P» et enfin suivi de caractères après l'art. Li>
  • Les caractères avant P devraient être triés en descendant comme un nombre décimal, le premier premier ex-4.5,4,2 ,3,9 le plus élevé et ils décident de l'ordre principal. LI>
  • Si les caractères avant «P» sont identiques, il doit utiliser les caractères entre «P» et «S» comme deuxième ordre de préférence et triés comme un nombre, le plus élevé d'abord. Li>
  • Si les caractères avant et après «P» sont identiques, les caractères suivants après «S» doivent être pris en compte pour le tri en nombre, le plus élevé d'abord. li> ul>

    Échantillon Source Data: P>

    with firmware_name as (
    select '3.9P2S1' as firmware from dual union all
    select '4.0P5S1' as firmware from dual union all
    select '3.10P4S1' as firmware from dual union all
    select '3.11P2S3' as firmware from dual union all
    select '3.7P2S1' as firmware from dual union all
    select '3.2P10S1' as firmware from dual union all
    select '4.0P4S1' as firmware from dual union all
    select '3.5P2S1' as firmware from dual union all
    select '4.0P16S1' as firmware from dual union all
    select '3.12P6S1' as firmware from dual union all
    select '3.12P10S2' as firmware from dual union all
    select '3.14P3S2' as firmware from dual)
    select * from firmware_name
    order by to_number(regexp_substr(firmware, '^\d+')) desc nulls last,
    to_number(regexp_substr(firmware, '^\d+\.(\d+)', 1, 1, null, 1)) desc,
    regexp_replace(firmware, '\d+\.\d+') desc;
    


0 commentaires

3 Réponses :


1
votes

Qu'en est-il de cela:

order by 
   to_number(regexp_replace(firmware, 'P.+$')) desc nulls last,
   to_number(regexp_replace(firmware, '^.+P(\d+)S.+$', '\1')) desc,
   to_number(regexp_replace(firmware, '^.+S')) desc


1 commentaires

Merci beaucoup pour votre réponse, cela fonctionne parfaitement! Appréciez-le.



1
votes

J'utiliserais regexp_substr () : xxx

La première expression capture les caractères au début de la chaîne jusqu'à un 'p' est rencontré (exclu). La seconde capture tout après 'P' jusqu'à ce qu'un ' est rempli. L'expression finale capture tout après le dernier '.


2 commentaires

Merci d'avoir pris le temps de répondre à ma question, j'apprécie vraiment ... cela a été travaillé pour la plupart, mais lors de la vérification, les valeurs situées dans le bas 3.12P10SS2 et 3.12P6S1 n'ont pas été triés correctement. 3.12P6S1 a été trié plus haut puis 3.12P10S2.


@Kavinpalaniswamy: corrigé.



1
votes

Vous pouvez utiliser ce qui suit, où vous utilisez la même regex, mais un numéro d'occurrence différent: xxx


1 commentaires

Merci beaucoup pour votre réponse. Cela fonctionne parfaitement, je l'ai testé avec une valeur multiple et fonctionne parfaitement. C'est bien. Merci encore