2010-07-23 6 views
2

quand je fais:raccourci de requête SQL pour ne pas sélectionner des colonnes null lorsque vous faites tout sélectionner

SELECT * 
FROM SOMETABLE 

Je reçois toutes les colonnes de SomeTable, mais je ne veux pas les colonnes qui sont NULL (pour tous les enregistrements) . Comment puis-je faire cela?

Raison: cette table a 20 colonnes, 10 d'entre elles sont définies mais 10 d'entre elles sont nulles pour certaines requêtes. Et il est temps de taper les columnNames ....

Merci,

Voodoo

+0

Vous avez des exemples de données et une sortie attendue? –

+4

Trop paresseux pour taper les noms des colonnes ?! Sérieusement ... Pensez-y à nouveau. – Tomalak

+0

semble assez poisson pour moi de penser que c'est peut-être un problème de normalisation. les colonnes doivent être des lignes d'une autre table. – Randy

Répondre

2

SQL prend en charge le * générique qui signifie toutes les colonnes. Il n'y a pas de caractère générique pour toutes les colonnes sauf celles que vous ne voulez pas.

Tapez les noms des colonnes. Il ne peut pas être plus de travail que de poser des questions sur Stack Overflow. En outre, copier & pâte est votre ami.

Une autre suggestion consiste à définir un afficher qui sélectionne les colonnes que vous souhaitez, puis vous pouvez select * à partir de la vue à tout moment.

+0

+1 La plupart des moteurs SQL prennent en charge la sélection de méta-données sur la structure de la table, etc. Exploiter cette ressource pour sélectionner des noms de colonnes pertinents et même générer des instructions SQL complètes par programmation ne peut pas non plus être aussi difficile. – Tomalak

+0

@Tomalak: Oui, mais cela vous indique la liste de toutes les colonnes dans une table donnée, pas celles que vous ne voulez pas pour une requête spécifique. –

+0

C'est une excellente idée, à propos de l'utilisation des vues. Merci les gars! Et Bill - Ouais c'est plus de travail que de le demander sur Stack Overflow :) c'mon .... – VoodooChild

1

C'est possible, mais plutôt compliqué. Vous pouvez récupérer la liste des colonnes d'une table à partir de INFORMATION_SCHEMA.COLUMNS. Pour chaque colonne, vous pouvez exécuter une requête pour voir si une ligne non nulle existe. Enfin, vous pouvez exécuter une requête basée sur la liste de colonnes qui en résulte.

est ici une façon de le faire, avec un curseur:

declare @table_name varchar(256) 
set @table_name = 'Airports' 

declare @rc int 
declare @query nvarchar(max) 
declare @column_list varchar(256) 
declare columns cursor local for select column_name 
    from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @table_name 
open columns 
declare @column_name varchar(256) 
fetch next from columns into @column_name 
while @@FETCH_STATUS = 0 
    begin 
    set @query = 'select @rc = count(*) from ' + @table_name + ' where ' + 
     @column_name + ' is not null' 

    exec sp_executesql @query = @query, @params = N'@rc int output', 
     @rc = @rc output 

    if @rc > 0 
     set @column_list = case when @column_list is null then '' else 
      @column_list + ', ' end + @column_name 


    fetch next from columns into @column_name 
    end 

close columns 
deallocate columns 

set @query = 'select ' + @column_list + ' from ' + @table_name 
exec sp_executesql @query = @query 

Cela fonctionne sur SQL Server. Cela pourrait être assez proche pour Sybase. Heureusement, cela montre que taper une liste de colonnes n'est pas si mal :-)

+0

sur Sybase vous devez utiliser les tables sysobjects/syscolumns, que MS a toujours comme vues de compatibilité. – Rawheiser

+0

Merci, je vais regarder à fond - mais il est certainement plus de travail que de taper dans les noms :) – VoodooChild

Questions connexes