0
votes

Ordre Oracle SQL par Varchar2 avec '_'

J'ai une table avec une colonne varchar2. Le tri par colonne ne m'a pas donné le résultat attendu:

Col 
1. '4___'
2. '_83_'
3. '_81_'
4. '____'

renvoie:

Col 
1. '_83_'
2. '_81_'
3. '4___'
4. '____'

J'attendais:

with test (col) as
  (select '_83_' from dual union all
   select '_81_' from dual union all
   select '4___' from dual union all
   select '____' from dual
  )
select * from test
order by col desc;

Pouvez-vous expliquer cela et m'aider à obtenir '4___' au début de ma commande par relevé?

Modifier à l'aide de la déclaration Littlefoots pour la préproduction ...

Modifier J'utilise Oracle 12c

Modifier NLS_Sort est défini sur la langue allemande. C'était le problème.


7 commentaires

Pouvez-vous mettre des exemples de données et la sortie attendue également, il est difficile de suggérer quoi que ce soit avec moins d'informations.


Vous pouvez définir NLS_SORT sur binaire ou utiliser order by nlssort (column1, 'NLS_SORT = BINARY') desc , mais je ne sais pas pourquoi Oracle ignore les traits de soulignement par défaut.


Quelle est la valeur actuelle de votre paramètre NLS_SORT?


@PonderStibbons car oracle ignore les traits de soulignement si le paramètre de tri est linguistique. Le tri basé sur une table ASCII ou BINARY définit différentes règles de tri pour les traits de soulignement des NLS_SORT linguistiques


@CaiusJard - oui, je le vois sur des exemples, mais je ne trouve pas cette information dans les documents Oracle.


@PonderStibbons comme ça, tu veux dire? docs.oracle.com/cd/B19306_01/server.102/ b14225 / ch5lingsort.h‌ tm


Mon NLS_SORT a été défini sur l'allemand. Cela a causé le problème.


4 Réponses :


0
votes

Je ne comprends pas la question. Oui, un commentaire serait plus approprié mais je ne peux pas poster ceci:

SQL> with test (col) as
  2    (select '_83_' from dual union all
  3     select '_81_' from dual union all
  4     select '4___' from dual union all
  5     select '____' from dual
  6    )
  7  select * from test
  8  order by col;

COL
----
____
4___
_81_
_83_

SQL>

Comme vous pouvez le voir, mes résultats diffèrent des vôtres, c'est-à-dire que je ne peux pas reproduire ce que vous dites. Pourriez-vous l'expliquer une fois de plus, s'il vous plaît?


7 commentaires

Mon résultat est également différent 4___ 81 83 ____


@MansiRaval vous voulez dire que votre résultat est différent de littlefoot?


Vous exécutez: order by col; Je lance: order by col desc;


mais toi et moi avons 4___ entre ____ et _ 81 _ c'est la partie que je n'obtiens pas ... je m'attendais à ce que Mansi Raval a obtenu ...


@CaiusJard oui le ______ est le dernier dans mon cas.


dbfiddle.uk/... "4___" et "____" sont des éléments haut / bas selon ASC / DESC


Non @Serg, c'est à cause des paramètres NLS. dans mon système, la valeur nls_sort est nulle et la valeur par défaut provient du paramètre nls_language.



0
votes

Utilisation d'Oracle 11g R2:

____
_83_
_81_
4___

Sortie:

Select Column1 From (
    SELECT CAST( '_83_' AS varchar2(4) ) AS Column1 FROM dual
    union all
    SELECT CAST( '_81_' AS varchar2(4) ) AS Column1 FROM dual
    union all
    SELECT CAST( '4___' AS varchar2(4) ) AS Column1 FROM dual
    union all
    SELECT CAST( '____' AS varchar2(4) ) AS Column1 FROM dual
) A order by Column1  desc


0 commentaires

3
votes

Dans ma base de données locale, NLS_SORT est défini sur BINARY donc il n'est pas reproductible.

NLS_SESSION_PARAMETERS
NLS_DATABASE_PARAMETERS

Mais, après avoir changé NLS_SORT de BINARY à GERMAN , le problème est reproduit.

ALTER SESSION SET NLS_SORT=GERMAN;

WITH TEMO AS 
(
SELECT '_83_' AS X FROM DUAL UNION ALL
SELECT '_81_' AS X FROM DUAL UNION ALL
SELECT '4___' AS X FROM DUAL UNION ALL
SELECT '____' AS X FROM DUAL
)
SELECT * FROM TEMO ORDER BY X DESC;

X   
----
_83_
_81_
4___
____

Vous pouvez vérifier les valeurs NLS en utilisant le tableau suivant:

WITH TEMO AS 
(
SELECT '_83_' AS X FROM DUAL UNION ALL
SELECT '_81_' AS X FROM DUAL UNION ALL
SELECT '4___' AS X FROM DUAL UNION ALL
SELECT '____' AS X FROM DUAL
)
SELECT * FROM TEMO ORDER BY X DESC;

X   
----
____
_83_
_81_
4___

donc la conclusion est NLS_SORT doit être défini en conséquence car tout le monde ne souhaite pas trier en utilisant la technique.

La valeur par défaut de NLS_SORT est dérivée de NLS_LANGUAGE.

Reportez-vous documents oracle pour plus d'informations sur NLS_SORT.

La solution est de changer NLS_SORT selon les besoins.

Cheers !!


2 commentaires

Vous l'avez trouvé :-) ... Mais, après avoir changé NLS_SORT de BINARY en GERMAN, le problème est reproduit ....


Vous pouvez changer la valeur de nls_sort en null et attribuer une valeur comme AMERICAN à nls_language. v $ paramètre Name = nls_sort et value = null name = nls_language et value = AMERICAN



0
votes

Personnellement, je recommanderais la réponse de Tejash, mais vous pouvez également la mélanger avec quelque chose comme:

SELECT * FROM table ORDER BY TRANSLATE(col, '_', 'z') desc;


0 commentaires