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.

41voto

Anthony Faull Points 6490

Oui, c'est possible (mais pas recommandé).

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

0 votes

Merci ! C'était la clé pour résoudre mon problème .

0 votes

J'ai une question : pour quelle raison la deuxième sélection doit-elle être placée dans une instruction EXEC ? J'ai vu que c'est effectivement nécessaire, mais je me demande pourquoi je ne peux pas simplement écrire SELECT @columns FROM contact

22voto

MrTelly Points 10828

Comme les autres l'ont dit, il n'y a aucun moyen de faire cela, mais si vous utilisez Sql Server, une astuce que j'utilise est de changer la sortie en virgule séparée, puis de faire

select top 1 * from table

et couper la liste complète des colonnes de la fenêtre de sortie. Vous pouvez alors choisir les colonnes que vous voulez sans avoir à les taper toutes.

15 votes

Voir mon conseil sur le déplacement à partir de SSMS

13voto

marc_s Points 321990

En fait, vous ne pouvez pas faire ce que vous voulez, mais vous pouvez vous procurer les bons outils pour vous faciliter la tâche.

Si vous regardez le site Red-Gate Invite SQL vous pouvez taper "SELECT * FROM MyTable", puis déplacer le curseur après le "*" et appuyer sur <TAB> pour développer la liste des champs et supprimer les quelques champs dont vous n'avez pas besoin.

Ce n'est pas une solution parfaite, mais une très bonne solution ! :-) Dommage que l'Intellisense de MS SQL Server Management Studio ne soit toujours pas assez intelligent pour offrir cette fonctionnalité........

Marc

0 votes

C'est bien, mais le problème est que votre requête peut devenir énorme. Ce serait bien d'avoir la fonction "except", non pas pour le code de production, mais pour les requêtes ad-hoc.

11voto

ggalmazor Points 165

Beaucoup de choses ont déjà été dites à ce sujet, mais je voulais présenter un cas où une telle fonctionnalité serait souhaitable.

Dans Oracle, pour paginer les résultats, vous devez faire quelque chose comme ceci :

SELECT * FROM (
  SELECT rownum rnum, t.*
  FROM sometable t
) WHERE rnum BETWEEN 10 AND 19;

(Cela vous donne des lignes entre 10 et 19 inclus).

Ou une variante de ceci qui aboutira à un ensemble de colonnes de (rnum + t.*).

Dans ce scénario, je préférerais dire à l'instruction SELECT supérieure de tout récupérer sauf la première colonne, dont j'ai seulement besoin pour le filtrage de la pagination.

9voto

Ali Kazmi Points 1158

Non, il n'y a pas de moyen de le faire. vous pouvez peut-être créer des vues personnalisées si cela est possible dans votre situation.

EDIT Peut-être que si votre base de données supporte l'exécution de sql dynamique, vous pouvez écrire un SP et lui passer les colonnes que vous ne voulez pas voir et le laisser créer la requête dynamiquement et vous retourner le résultat. Je pense que c'est faisable dans SQL Server au moins.

14 votes

C'est faisable mais je virerais la personne qui fait ça.

0 votes

Problème classique de nettoyage : copier les données que vous voulez conserver dans une table temporaire, tronquer la grande table, remplir à nouveau avec la table temporaire. Vous devez exclure la colonne d'identité.

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