1143 votes

SQL exclure une colonne en utilisant SELECT * [sauf colonneA] de tableA ?

Nous savons tous que pour sélectionner toutes les colonnes d'un tableau, nous pouvons utiliser

SELECT * FROM tableA

Existe-t-il un moyen d'exclure une ou plusieurs colonnes d'un tableau sans spécifier toutes les colonnes ?

SELECT * [except columnA] FROM tableA

Le seul moyen que je connaisse est de spécifier manuellement toutes les colonnes et d'exclure la colonne indésirable. Cela prend beaucoup de temps et je cherche donc des moyens d'économiser du temps et des efforts sur ce point, ainsi que sur la maintenance future si la table a plus ou moins de colonnes.

Merci !

58 votes

Il serait très pratique de disposer de cette fonctionnalité, non pas pour la mettre dans le code de production, mais à des fins de dépannage. Exemple : J'ai une table qui a plusieurs colonnes que j'interroge, mais je veux rapidement omettre une ou deux colonnes de texte.

0 votes

J'en avais besoin lorsque je travaillais avec openquery (bien que j'aie besoin de la fonctionnalité dans MySQL plutôt que dans SQL Server). Je devais interroger une base de données MySQL à l'aide de SQL Server. Parce qu'une table MySQL avait des colonnes de caractères de largeur fixe, je ne pouvais pas utiliser une fonction SELECT * (OLE DB a du mal à les mettre en correspondance). Je n'ai pas pu spécifier les bonnes colonnes car je n'avais pas d'accès direct à la base de données MySQL, mais SQL Server a eu la gentillesse de m'informer des noms des colonnes de caractères à largeur fixe...

9 votes

J'aimerais ajouter une autre raison de le faire : SELECT DISTINCT * sauf pour la colonne clé qui doit fonctionner sans dupliquer les lignes que quelqu'un d'autre a créées.

9voto

asdasdasd Points 11

Si vous utilisez MS SQL Server Management Studio, procédez comme suit :

  1. tapez le nom des tables que vous souhaitez et sélectionnez-les
  2. appuyez sur Alt+F1
  3. o/p montre les colonnes dans le tableau.
  4. Sélectionnez les colonnes souhaitées
  5. Copiez et collez-les dans votre requête de sélection
  6. Lancez la requête.

Profitez-en.

8voto

cjk Points 27463

Dans SQL Management Studio, vous pouvez développer les colonnes dans l'Explorateur d'objets, puis faire glisser l'icône de la colonne. Columns dans une fenêtre de requête pour obtenir une liste de colonnes séparées par des virgules.

0 votes

Cette réponse est bien trop sous-estimée. C'est le moyen le plus facile et le plus rapide.

7voto

Shrage Smilowitz Points 2877

En résumé, vous ne pouvez pas le faire, mais je ne suis pas d'accord avec tous les commentaires ci-dessus, il y a "des" scénarios où vous pouvez légitimement utiliser un *. Lorsque vous créez une requête imbriquée afin de sélectionner une plage spécifique dans une liste entière (comme la pagination), pourquoi diable voudriez-vous spécifier chaque colonne dans l'instruction de sélection externe alors que vous l'avez fait dans l'instruction interne ?

0 votes

Pouvez-vous utiliser une variante de "innername.*" pour représenter les colonnes internes, comme "SELECT table1.* ..." lors d'une jointure ?

7voto

onedaywhen Points 24594

Le langage de base de données (véritablement) relationnel Tutoriel D supporte un tel raccourci en utilisant ALL BUT . Cependant, rien de semblable n'a été introduit dans le langage SQL (pas vraiment relationnel).

1 votes

@underscore_d : J'ai maintenant révisé ma réponse.

0 votes

Cool, je suis d'accord avec tes 2 derniers paragraphes. L'info sur le Tutorial D est intéressante, même si j'ai tendance à être d'accord avec ceux qui pensent que select * est discutable - il est très utile pour les tâches ad hoc et les programmes qui doivent manipuler de manière générique des tableaux de données, mais pas vraiment pour construire (par manque d'un meilleur terme) des requêtes "pures". Néanmoins, le fait de ne pas être dans la norme ANSI ne signifie pas que Microsoft ne peut pas l'ajouter à son dialecte, comme pour beaucoup d'autres choses, mais je suis sceptique quant à leur volonté de le faire.

7voto

AlexandreWL Points 11

Si nous parlons de procédures, cela fonctionne avec cette astuce pour générer une nouvelle requête et l'EXECUTER IMMEDIATEMENT :

SELECT LISTAGG((nom_colonne), ', ') WITHIN GROUP (ORDER BY column_id) INTO var_list_of_columns DE TOUTES LES COLONNES DE L'ONGLET WHERE nom_de_table = 'PUT_HERE_YOUR_TABLE' et nom_de_colonne NOT IN ('PUT_HERE_YOUR_TABLE') AND column_name NOT IN ('dont_want_this_column', 'neither_this_one', 'etc_column') ;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X