ich sagte:
Was ist der Fehler Sie erhalten? Oder was ist das falsche Verhalten, das du bekommst? In meiner Anpassung Ihrer Frage an meine Datenbank musste ich sicherstellen, dass die numerische Spalte in einen Zeichentyp konvertiert wurde, bevor DECODE() akzeptabel war - die anderen beiden Spalten waren Zeichenspalten. Damit und mit dem kleinen Problem, dass die alphabetische Sortierung der Zahlen "8" nach "79" und vor "80" ergibt, habe ich ein passendes Ergebnis erhalten.
Rohit gestellt:
Dank für die Eingänge. Ich denke, ich bin verwirrt über das kleine Problem, das Sie erwähnt haben, dass "die alphabetische Sortierung von Zahlen" 8 "nach" 79 "und vor" 80 "platziert. Ich konnte nicht verstehen, was ist das Ding hier? Könnten Sie mir bitte auch bei der Abfrage helfen, wie "sichergestellt werden soll, dass die numerische Spalte in einen Zeichentyp umgewandelt wurde, bevor DECODE() akzeptabel war". Können Sie meine Anfrage oben in dieser Hinsicht ändern?
Die Tabelle I verwendet wird, ist für die ‚Tabelle der Elemente‘:
-- 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'))
);
Es ist ein interessanter Tisch, weil es drei echte Kandidatenschlüssel hat (Ordnungszahl, Name und Symbol ist jeweils einzigartig), und abhängig vom Kontext (Isotope gegen Chemikalien), sind Sie besser dran, die Ordnungszahl oder das Symbol als Verbindungsschlüssel zu verwenden.
Die Abfragen I waren:
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;
Diese zeigten die drei Ordnungen - durch das Symbol, mit Namen, und von der Ordnungszahl.
Teil des Ergebnisses für die Ordnungszahl Ordnungs eingestellt war:
77 Iridium Ir 77
78 Platinum Pt 78
79 Gold Au 79
8 Oxygen O 8
80 Mercury Hg 80
81 Thallium Tl 81
Da die Ordnungszahl in einen String dazu gezwungen wurde, die Art war in String um, und wenn als String betrachtet, ‚8‘ erscheint nach '79' und vor '80', wie gezeigt. Eine Möglichkeit, dieses Problem zu vermeiden wäre:
select decode('atomic_number',
'name', name,
'symbol', symbol,
'atomic_number', lpad(atomic_number, 3)),
name, symbol, atomic_number
from elements
order by 1;
Herstellung der folgenden (die, auch wenn es nicht offensichtlich ist, hat ein zusätzliches Leerzeichen am Anfang der ersten Spalte):
77 Iridium Ir 77
78 Platinum Pt 78
79 Gold Au 79
80 Mercury Hg 80
81 Thallium Tl 81
82 Lead Pb 82
Diese verwendet das Wissen, dass Leerzeichen jeder Ziffer in der Sortierreihenfolge (ASCII, Latin-1, Unicode) vorangestellt sind und dass Ordnungszahlen nicht mehr als 3 Ziffern umfassen. Alternativ hätte ich 'LPAD(atomic_number, 3, '0')
' verwenden können, um die Daten auf Null zu setzen. Ich habe mit IBM Informix Dynamic Server (IDS) 11.50.FC3W2 unter Solaris 10 getestet. IDS toleriert sehr unterschiedliche Typen und konvertiert das Argument atomic_number automatisch in LPAD in eine Zeichenfolge. Andere DBMS sind möglicherweise nicht so tolerant; Sie müssten den Wert explizit umwandeln.
zurück zur Frage gehen ...
Member Unter der Annahme ist eine numerische Spalte und die Werte sind nicht mehr als 4 Ziffern lang (entsprechend anpassen, wenn sie länger sind), kann die Abfrage geschrieben werden:
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;
oder Sie brauchen:
LPAD(CAST(memberCount AS CHAR(4)), 4)
oder eine andere leicht DBMS-spezifische Beschwörung, die die gleiche allgemeine Wirkung erzielt.
Da Sie kein Schema (viel weniger Beispieldaten) für die Abfrage vorsah, ich habe nicht die Tabelle in meiner Datenbank, so kann ich Ihre Frage nicht Demo arbeiten
Was der Fehler ist, dass Sie bekommen? Oder was ist das falsche Verhalten, das du bekommst? In meiner Anpassung Ihrer Frage an meine Datenbank musste ich sicherstellen, dass die numerische Spalte in einen Zeichentyp konvertiert wurde, bevor DECODE() akzeptabel war - die anderen beiden Spalten waren Zeichenspalten. Damit und mit dem kleinen Problem, dass die alphabetische Sortierung der Zahlen "8" nach "79" und vor "80" ergibt, habe ich ein passendes Ergebnis erhalten. –
Hallo Jonathan, Danke für die Eingaben.Gruß, ich bin verwirrt über das kleinere Problem, das Sie erwähnt, dass "das Sortieren von Zahlen alphabetisch '8' nach '79' und vor '80'". Ich könnte nicht bekommen, was ist das Ding hier? Auch - könnten Sie bitte in meiner Abfrage helfen, wie "um sicherzustellen, dass die numerische Spalte in einen Zeichentyp konvertiert wurde, bevor die DECODE() war akzeptabel". können Sie bitte meine Abfrage oben in dieser Hinsicht ändern. Dank Rohit –