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
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é. –
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 –