2010-11-02 8 views
14

Ich weiß, dassSQL Eine Auflistung aller Spaltennamen alphabetisch

SELECT * FROM Table 

alle Spalten in der Tabelle auflistet, aber ich bin daran interessiert, die Spalten in alphabetischer Reihenfolge auflistet.

Sagen, ich habe drei Spalten, "Name", "Alter" und "Sex".

Ich mag die Spalten im Format organisiert

|age| |name| |sex| 

Ist es möglich, dies mit SQL zu tun?

Antwort

12

Ja und nein :-)

SQL selbst kümmert sich nicht darum, was Reihenfolge die Spalten kommen in, aber wenn Sie verwenden waren:

select age, name, sex from ... 

finden Sie würden, dass sie wahrscheinlich kam in dieser Reihenfolge heraus (obwohl ich nicht sicher bin, dass SQL-Standards dies vorschreiben).

Jetzt können Sie nicht wollen, das zu tun, aber manchmal das Leben ist nicht fair :-)

Sie haben auch die andere Möglichkeit, die DBMS Datendefinitionstabellen verwenden, um dynamisch eine Abfrage zu erstellen. Dies ist nicht portierbar, aber die meisten DBMS liefern diese Tabelle (wie SYSIBM.SYSCOLUMNS von DB/2) und Sie können die Spaltennamen von dort in einer geordneten Weise auswählen. Etwas wie:

select column_name from sysibm.syscolumns 
where owner = 'pax' and table_name = 'movies' 
order by column_name; 

Dann nutzen Sie die Ergebnisse dass Abfrage die reale Abfrage zu erstellen:

query1 = "select column_name from sysibm.syscolumns" + 
     " where owner = 'pax' and table_name = 'movies'" + 
     " order by column_name" 
rs = exec(query1) 
query2 = "select" 
sep = " " 
foreach colm in rs: 
    query2 += sep + colm["column_name"] 
    sep = ", " 
query2 += " from movies order by rating" 
rs = exec(query2) 
// Now you have the rs recordset with sorted columns. 

Allerdings sollten Sie wirklich kritisch alle Anfragen prüfen, die * wählen - in der überwiegenden Mehrheit von Fällen ist es unnötig und ineffizient. Und die Präsentation der Daten sollte wahrscheinlich von der Präsentationsschicht und nicht vom DBMS selbst vorgenommen werden - das DBMS sollte die Daten so effizient wie möglich zurückgeben.

+0

hmm, ich denke, ich muss auf die gute alte Methode zurückgreifen, mich selbst zu sortieren :) –

+1

Ich stimme damit überein, NIEMALS * im Produktionscode zu verwenden. Sie wissen nie, wenn jemand später eine Spalte hinzufügt, die NICHT aufgeführt werden sollte, zum Beispiel für die Sicherheit. Erstellen Sie die Abfrage immer so, dass nur die benötigten Spalten abgerufen werden. Und wenn Sie es dynamisch machen wollen, achten Sie darauf, dies für andere Entwickler sichtbar zu beachten. –

+0

Eine weitere dieser, wenn die Verwendung von SQL-Ansichten * hat mehr Nebenwirkungen darin, wenn die zugrunde liegenden Tabellen geändert werden (neue oder entfernte Spalte) die Ansicht nicht aktualisiert, so dass es möglicherweise keine neuen Spalten angezeigt oder vorhandene Spalten möglicherweise ersetzt werden, wie die Ansicht wählt Spalte nach dem Index, den sie bei der Erstellung der Ansicht hatten. –

0

Sie können nur Spalten angeben, die Sie auswählen möchten:

SELECT age, name, sex FROM Table 

Spalten werden in der gleichen Reihenfolge angezeigt werden, wie Sie sie in Abfrage angegeben.

+0

Danke für die Antwort. Tatsächlich ist die Situation so, dass es mühsam wäre, so viele Spalten zu schreiben. Deshalb habe ich mich gefragt, ob es möglich ist, dies direkt mit SQL-Abfragen zu tun. Vielleicht wäre eine Alternative, die Spaltennamen aufzulisten und ein externes Programm zu verwenden, um die Spaltennamen zu sortieren. –

4
  • Es gibt keine Möglichkeit, dies ohne dynamisches SQL automatisch zu tun.
  • SELECT * wird nicht empfohlen und wird keine Spaltennamen
  • Sie haben explizit SELECT age, name, sex FROM

auf SQL-Ebene, es spielt keine Rolle, sortieren würde zu tun. Es spielt keine Rolle für jedes Client-Code-Objekt -

Wenn es wichtig ist, dann sortieren, wenn Sie die Daten dem Client präsentieren.

Entschuldigung, es ist einfach so ...

3

SQL-92 Standard gibt an, dass bei Verwendung von SELECT * die Spalten in aufsteigender Reihenfolge ihrer Ordinalposition innerhalb der Tabelle referenziert werden. Die relevanten Abschnitte sind 4,8 (Spalten) und 7,9 (Abfragespezifikation). Ich kenne keine Herstellererweiterungen des Standards, die es erlauben würden, dass Spalten in einer anderen Reihenfolge zurückgegeben werden, wahrscheinlich weil die Verwendung von SELECT * im Allgemeinen nicht empfohlen wird.

Sie können SQL DDL verwenden, um sicherzustellen, dass die Ordinalpositionen der Spalten der gewünschten alphabetischen Reihenfolge entsprechen. Dies funktioniert jedoch nur so, wie Sie es wünschen, wenn Sie eine einzelne Tabelle in der FROM-Klausel referenzieren. Wenn auf zwei Tabellen verwiesen wird, gibt SELECT * die Spalten aus der ersten Tabelle in Ordnungsreihenfolge zurück, gefolgt von den Spalten der zweiten Tabelle in Ordinalposition, sodass die Spalten des vollständigen Ergebnissatzes möglicherweise nicht in alphabetischer Reihenfolge vorliegen.

9

Dies generiert eine Abfrage mit allen alphabetisch sortierten Spalten in der SELECT-Anweisung.

DECLARE @QUERY VARCHAR(2000) 
DECLARE @TABLENAME VARCHAR(50) = '<YOU_TABLE>' 

SET @QUERY = 'SELECT ' 
SELECT @QUERY = @QUERY + Column_name + ', 
' 
    FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @TABLENAME 
ORDER BY Column_name 

SET @QUERY = LEFT(@QUERY, LEN(@QUERY) - 4) + ' 
FROM '+ @TABLENAME 

PRINT @QUERY 
EXEC(@QUERY) 
+1

Das geht davon aus, dass die Abfrage immer ad-hoc ausgeführt wird, ist aber auch ein guter Ausgangspunkt, wenn das Poster mit dynamic sql in Ordnung ist. – RThomas

+2

Arbeitete für mich, mit dieser Revision Änderung der linken Aussage (len) - 4 zu -1 – Brian

Verwandte Themen