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.
4 Réponses :
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?
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.
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
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 !!
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
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;
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.