2009-04-30 8 views
1

Dieses Problem ist eine Fortsetzung meiner earlier query. Es funktioniert immer noch nicht. Es handelt sich um eine ORDER BY-Klausel. Ich versuche, mit einer Variablen namens "sortby" zu sortieren.SQL-Reihenfolge nach Issue-Continued

Hier wird jetzt die ORDER BY-Klausel als separate Spalte mit der Funktion DECODE() (wie in der Antwort von @devio in der ursprünglichen Version dieser Frage vorgeschlagen) ausgewählt.

Sagen wir in diesem Fall sortby = 'memberCount', ich habe es als erstes Argument in decode() übergeben; memberCount ist eine Spalte in der Grptest-Tabelle.

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; 

Es funktioniert nicht.

Aber wenn ich 'Name' als erstes Argument in oben dekodieren, funktioniert es. Das ist mein ursprüngliches Problem, warum es nicht auf memberCount gilt.

+0

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

+0

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 –

Antwort

0

Ich weiß, dass

order by p_sortby 

nicht funktionieren, aber könnten Sie

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

versuchen EDIT:

ich eine andere Art und Weise in Erinnerung:

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

und auf diese Weise könnte sei sogar schneller

+0

Thanks.I hoffe, ich bekomme es richtig, wie Sie vorgeschlagen haben. Jetzt habe ich den DECODE mit p_sortby in der ORDER BY cluase. Order von decode ('memberCount', 'name', gl.group_name_key, 'description', gl.group_description_key, 'memberCount', gl.member_count); ** Aber wie kann ich Bestellung von 2 nach Bedarf verwenden –

+0

Ich benutze Bestellung von 1, wenn ich einen kurzen Blick auf einige Daten benötigen, aber ich vermeide es in der Produktion verwenden, weil Sie immer die richtige Reihenfolge der Spalten überprüfen müssen. Was du niemals tun solltest. – Azder

+0

Ja, ich kann deine Sichtweise verstehen. Aber Problem ist es funktioniert nicht mit der obigen ORDER BY-Klausel mit der Dekodierung-Anweisung. Es gibt eine SQL SYNTAX-Fehler in Oracle, wenn ich die "wie p_sortby" in der Klausel. Aber das Entfernen funktioniert nicht. –

2

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

+0

Vielen Dank, ich habe verstanden und es hat super geklappt. Problem ist, ich sortiere jetzt auf der PARENT_GROUP_NAME, die in der inneren Abfrage in meiner Anweisung SELECTED ist. Wenn wir nach parent_group_name sortieren, wird es in der Select-Dekodierspalte nicht funktionieren. TABLE grptest CREATE ( 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), MEMBER_COUNT NUMBER, GROUP_NAME_KEY NVARCHAR2 (250), GROUP_DESCRIPTION_KEY NVARCHAR2 (2000) ) –

+0

Sorry wieder für das Format in den Kommentaren.Ich habe eine Tabelle in den obigen Kommentar gesetzt. und die andere Tabelle ist -------- // 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

Ich wollte diese Frage zu schließen, wie es bereits beantwortet. Vielen Dank Jonathan –

Verwandte Themen