2009-04-30 7 views
1

Ce problème est la suite de mon earlier query. Ça ne marche toujours pas. Il s'agit d'une clause ORDER BY. J'essaie de trier en utilisant une variable appelée "sortby".Ordre SQL par problème-Suite

Ici, maintenant la clause ORDER BY est sélectionnée comme une colonne séparée en utilisant la fonction DECODE() (comme suggéré dans la réponse par @devio dans la version originale de cette question). Disons que sortby = 'memberCount' dans ce cas, je l'ai passé comme premier argument dans decode(); memberCount est une COLONNE dans la table grptest.

select distinct gl.group_id, 
     decode('memberCount', 'name',  gl.group_name_key, 
          'description', gl.group_description_key, 
          'memberCount', gl.member_count) 
      as p_sortby, 
     gl.group_name, 
     gl.group_description, 
     gl.status_code, 
     gl.member_count, 
     (select grpp.group_name 
      from grptest_relationship grel join grptest grpp 
        on grel.parent_group_id = grpp.group_id 
      where grel.child_group_id = gl.group_id) as parent_group_name, 
     gl.group_name_key, 
     gl.group_description_key 
    from grptest gl 
    where gl.group_org_id = '3909' 
    and (gl.group_name_key like '%' || 'GROUP' || '%') 
order by 2; 

Cela ne fonctionne pas. Mais si je passe 'nom' comme premier argument dans le décodage ci-dessus, cela fonctionne. C'est mon problème d'origine sur les raisons pour lesquelles cela ne s'applique pas sur memberCount.

+0

Quelle est l'erreur que vous obtenir? Ou quel est le comportement erroné que vous obtenez? Dans mon adaptation de votre question à ma base de données, je devais m'assurer que la colonne numérique était convertie en un type de caractère avant que le DECODE() soit acceptable - les deux autres colonnes étaient des colonnes de caractères. Avec cela fait, et avec le problème mineur que les numéros de tri par ordre alphabétique place '8' après '79' et avant '80', j'ai obtenu un résultat approprié. –

+0

Salut Jonathan, Merci pour les inputs.Guess, je suis confus au sujet du problème mineur que vous avez mentionné que "que les numéros de tri alphabétiquement place '8' après '79' et avant '80'". Je ne pouvais pas obtenir ce qui est la chose ici? Aussi-pourriez-vous s'il vous plaît aider dans ma requête de comment "s'assurer que la colonne numérique a été convertie en un type de caractère avant que le DECODE() soit acceptable". pouvez-vous s'il vous plaît modifier ma requête ci-dessus à cet égard. Merci Rohit –

Répondre

0

Je sais que

order by p_sortby 

ne fonctionnera pas, mais pourriez-vous essayer

order by decode('memberCount', 
    'name', gl.group_name_key, 
    'description', gl.group_description_key, 
    'memberCount', gl.member_count) 

EDIT:

je me suis souvenu d'une autre manière:

select * from (
    select column1, decode(....) as column2, .... from table1 
) t1 
order by 2 

et de cette façon pourrait même être un plus rapide

+0

Merci.J'espère que je l'ai compris comme vous l'avez suggéré. Maintenant, j'ai le DECODE avec p_sortby dans la clause ORDER BY. Ordre par décode ('memberCount', 'nom', nom_groupe_groupe, 'description', gl.group_description_key, 'memberCount', gl.member_count); ** Mais comment puis-je utiliser l'ordre de 2 au besoin? –

+0

J'utilise la commande par 1 quand j'ai besoin d'un coup d'oeil rapide de certaines données, mais je l'évite en production parce que vous devrez toujours vérifier l'ordre correct des colonnes. Ce qui est quelque chose que vous ne devriez jamais avoir à faire. – Azder

+0

Oui, je peux comprendre votre point de vue. Mais le problème est son ne fonctionne pas avec la clause ORDER BY ci-dessus ayant l'instruction de décodage.Il donne une ERREUR SYNTAXE SQL dans Oracle si je garde le "comme p_sortby" dans la clause. Mais, l'enlever ne fonctionne pas. –

2

Je commenté:

Quelle est l'erreur que vous obtenez? Ou quel est le comportement erroné que vous obtenez? Dans mon adaptation de votre question à ma base de données, je devais m'assurer que la colonne numérique était convertie en un type de caractère avant que le DECODE() soit acceptable - les deux autres colonnes étaient des colonnes de caractères. Avec cela fait, et avec le problème mineur que les numéros de tri par ordre alphabétique place '8' après '79' et avant '80', j'ai obtenu un résultat approprié.

Rohit a demandé:

Merci pour les entrées. Je suppose que je suis confus au sujet de la question mineure que vous avez mentionnée: «que les numéros de tri par ordre alphabétique des lieux '8' après '79' et avant '80'». Je ne pouvais pas obtenir ce qui est la chose ici? Aussi, pourriez-vous s'il vous plaît aider dans ma question de savoir comment "s'assurer que la colonne numérique a été convertie en un type de caractère avant que le DECODE() soit acceptable". Pouvez-vous s'il vous plaît modifier ma requête ci-dessus à cet égard?


Le tableau I utilisé est la « table des éléments »:

-- Tables for storing information about chemical elements and chemical compounds 
-- See: http://www.webelements.com/ for elements. 
-- See: http://ie.lbl.gov/education/isotopes.htm for isotopes. 

CREATE TABLE elements 
(
    atomic_number INTEGER NOT NULL UNIQUE 
        CHECK (atomic_number > 0 AND atomic_number < 120), 
    symbol   CHAR(3) NOT NULL UNIQUE, 
    name   CHAR(20) NOT NULL UNIQUE, 
    atomic_weight DECIMAL(8,4) NOT NULL, 
    stable   CHAR(1) DEFAULT 'Y' NOT NULL 
        CHECK (stable IN ('Y', 'N')) 
); 

C'est une table intéressante car elle dispose de trois touches de candidats d'origine (numéro atomique, le nom et le symbole sont chacun uniques), et en fonction du contexte (isotopes vs produits chimiques), il est préférable d'utiliser un nombre atomique ou un symbole comme clé de jointure.

Les requêtes I utilisées ont été:

select decode('atomic_number', 
        'name',   name, 
        'symbol',  symbol, 
        'atomic_number', atomic_number||''), 
     name, symbol, atomic_number 
    from elements 
    order by 1; 

select decode('name', 
        'name',   name, 
        'symbol',  symbol, 
        'atomic_number', atomic_number||''), 
     name, symbol, atomic_number 
    from elements 
    order by 1; 

select decode('symbol', 
        'name',   name, 
        'symbol',  symbol, 
        'atomic_number', atomic_number||''), 
     name, symbol, atomic_number 
    from elements 
    order by 1; 

Ces trois ont démontré les ordonnancements - par le symbole, par nom et par numéro atomique.

Une partie du jeu de résultats pour la commande de numéro atomique était:

77  Iridium   Ir  77 
78  Platinum  Pt  78 
79  Gold   Au  79 
8  Oxygen   O  8 
80  Mercury   Hg  80 
81  Thallium  Tl  81 

Parce que le numéro atomique a été sous la contrainte dans une chaîne, le genre était en ordre de chaîne, et quand considéré comme une chaîne, « 8 » apparaît après '79' et avant '80', comme indiqué. Une façon d'éviter ce problème serait:

select decode('atomic_number', 
        'name',   name, 
        'symbol',  symbol, 
        'atomic_number', lpad(atomic_number, 3)), 
     name, symbol, atomic_number 
    from elements 
    order by 1; 

Produire les éléments suivants (qui, bien que ce n'est pas évident, a un vide supplémentaire au début de la première colonne):

77  Iridium   Ir  77 
78  Platinum  Pt  78 
79  Gold   Au  79 
80  Mercury   Hg  80 
81  Thallium  Tl  81 
82  Lead   Pb  82 

Cette utilise la connaissance que l'espace précède n'importe quel chiffre dans la séquence de tri (ASCII, Latin-1, Unicode), et que les numéros atomiques ne sont pas plus de 3 chiffres. Alternativement, j'aurais pu utiliser 'LPAD(atomic_number, 3, '0')' pour mettre à zéro les données. J'ai testé avec IBM Informix Dynamic Server (IDS) 11.50.FC3W2 sous Solaris 10. IDS est très tolérant aux incompatibilités de type et convertit automatiquement l'argument atomic_number en LPAD en une chaîne. D'autres SGBD peuvent ne pas être aussi tolérants; vous devriez explicitement jeter la valeur.

Pour en revenir à la question ...

En supposant memberCount est une colonne numérique et les valeurs ne sont pas plus de 4 chiffres (ajuster correctement si elles sont plus), la requête peut être écrite:

select distinct gl.group_id, 
     decode('memberCount', 'name',  gl.group_name_key, 
          'description', gl.group_description_key, 
          'memberCount', LPAD(gl.member_count, 4)) 
      as p_sortby, 
     gl.group_name, 
     gl.group_description, 
     gl.status_code, 
     gl.member_count, 
     (select grpp.group_name 
      from grptest_relationship grel join grptest grpp 
        on grel.parent_group_id = grpp.group_id 
      where grel.child_group_id = gl.group_id) as parent_group_name, 
     gl.group_name_key, 
     gl.group_description_key 
    from grptest gl 
    where gl.group_org_id = '3909' 
    and (gl.group_name_key like '%' || 'GROUP' || '%') 
order by 2; 

ou vous pourriez avoir besoin:

LPAD(CAST(memberCount AS CHAR(4)), 4) 

ou une autre conjuration légèrement spécifiques au SGBD qui permet d'atteindre le même effet général.

Puisque vous n'avez pas fourni un schéma (beaucoup moins de données de l'échantillon) pour la requête, je n'ai pas votre table dans ma base de données, donc je ne peux pas la démo de votre requête de travail

+0

Merci beaucoup, j'ai compris et cela a bien fonctionné. Problème J'essaie de trier le PARENT_GROUP_NAME qui est en cours de SELECTION dans la requête interne de mon instruction. si nous classons par parent_group_name, cela ne fonctionnera pas dans la colonne select decode. CREATE TABLE grptest ( GROUP_ID VARCHAR2 (30 BYTE), GROUP_ORG_ID VARCHAR2 (30 BYTE), GROUP_NAME NVARCHAR2 (250), PARENT_GROUP_ID VARCHAR2 (30 BYTE), GROUP_DESCRIPTION NVARCHAR2 (2000), NUMERO DE MEMBER_COUNT, GROUP_NAME_KEY NVARCHAR2 (250), GROUP_DESCRIPTION_KEY NVARCHAR2 (2000) ) –

+0

Désolé encore pour le format dans la section des commentaires. J'ai mis un tableau dans le commentaire ci-dessus. et l'autre table est -------- // CREATE TABLE grptest_relationship ( PARENT_GROUP_ID VARCHAR2 (50 BYTE), CHILD_GROUP_ID VARCHAR2 (50 BYTE), UPDATED_DT DATE DEFAULT SYSDATE, UPDATED_BY VARCHAR2 (50 BYTE) ) // –

+0

Je voulais fermer cette question comme sa réponse déjà.Merci beaucoup Jonathan –

Questions connexes