2010-11-02 4 views
14

Je sais queSQL Liste de tous les noms de colonnes par ordre alphabétique

SELECT * FROM Table 

listera toutes les colonnes de la table, mais je suis intéressé par la liste des colonnes dans l'ordre alphabétique.

Dites, j'ai trois colonnes, "nom", "âge" et "sexe".

Je veux que les colonnes organisées dans le format

|age| |name| |sex| 

Est-il possible de le faire avec SQL?

Répondre

12

Oui et non :-)

SQL lui-même ne se soucie pas quel ordre les colonnes sortent dans mais, si vous deviez utiliser:

select age, name, sex from ... 

vous trouveriez qu'ils ont probablement est sorti dans cet ordre (même si je ne suis pas sûr que les normes SQL le mandatent).

Maintenant, vous ne peut pas veulent faire cela, mais parfois la vie est injuste :-)

Vous avez également l'autre possibilité d'utiliser les tables de définition de données SGBD pour construire dynamiquement une requête. Ce n'est pas portable, mais la plupart des SGBD fournissent ces tables (telles que SYSIBM.SYSCOLUMNS de DB/2) et vous pouvez sélectionner les noms de colonnes de manière ordonnée. Quelque chose comme:

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

Ensuite, vous utilisez les résultats de qui requête pour construire la vraie requête:

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. 

Cependant, vous devriez vraiment examiner de manière critique toutes les requêtes qui sélectionnent * - dans la grande majorité des cas, c'est inutile et inefficace. Et la présentation des données est quelque chose qui devrait probablement être fait par la couche de présentation, pas le SGBD lui-même - le SGBD devrait être laissé pour retourner les données de la manière la plus efficace possible.

+0

hmm, je suppose que je dois recourir à la bonne vieille méthode de tri des chaînes moi-même :) –

+1

Je suis d'accord avec cela, ne jamais utiliser * dans le code de production. Vous ne savez jamais quand quelqu'un ajoute plus tard une colonne qui ne devrait pas être listée, pour des raisons de sécurité par exemple. Toujours construire la requête pour récupérer uniquement les colonnes dont vous avez besoin. Et si vous voulez le faire dynamiquement, faites-le, mais assurez-vous de le noter très visiblement pour que les autres développeurs puissent le voir. –

+0

Encore une fois, si vous utilisez des vues SQL * a plus d'effets secondaires si les tables sous-jacentes sont changées (colonne nouvelle ou supprimée) la vue ne se met pas à jour et peut ne pas afficher de nouvelles colonnes colonne par l'indice qu'ils avaient sur la création de vue. –

0

Vous pouvez simplement spécifier des colonnes que vous souhaitez sélectionner:

SELECT age, name, sex FROM Table 

Les colonnes seront affichés dans le même ordre que vous les avez spécifiées dans la requête.

+0

Merci pour la réponse. En fait, la situation est telle qu'il serait fastidieux d'écrire autant de colonnes. C'est pourquoi je me demandais s'il était possible de le faire directement en utilisant des requêtes SQL. Peut-être une alternative serait de lister les noms de colonnes et d'utiliser un programme externe pour trier les noms de colonnes. –

4
  • Il n'existe aucun moyen de le faire automatiquement sans SQL dynamique.
  • SELECT * n'est pas recommandé et ne trier les noms de colonnes
  • Vous auriez à faire explicitement SELECT age, name, sex FROM

Au niveau SQL, il n'a pas d'importance. Ce n'est pas important pour un objet code client

Si c'est important, effectuez un tri lorsque vous présentez les données au client. Désolé, c'est comme ça ...

3

La norme SQL-92 spécifie que lorsque vous utilisez SELECT *, les colonnes sont référencées dans la séquence ascendante de leur position ordinale dans la table. Les sections pertinentes sont 4.8 (colonnes) et 7.9 (spécification de requête). Je ne connais aucune extension de fournisseur à la norme qui permettrait aux colonnes d'être retournées dans un autre ordre, probablement parce que l'utilisation de SELECT * est généralement déconseillée.

Vous pouvez utiliser SQL DDL pour vous assurer que les positions ordinales des colonnes correspondent à l'ordre alphabétique souhaité. Cependant, cela ne fonctionnera que de la manière que vous voulez en référençant une table sinlge dans la clause FROM. Si deux tables sont référencées, SELECT * renverra les colonnes de la première table en ordre de position ordinale suivi des colonnes de la deuxième table en position ordinale, de sorte que les colonnes de l'ensemble de résultats complet ne seront peut-être pas dans l'ordre alphabétique.

9

Cela génère une requête avec toutes les colonnes classées par ordre alphabétique dans l'instruction select.

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

Cela suppose que la requête sera toujours exécutée ad hoc mais est également un bon point de départ si l'affiche est compatible avec SQL dynamique. – RThomas

+2

A travaillé pour moi, avec cette révision changeant la déclaration de gauche (len) - 4 à -1 – Brian

Questions connexes