如何在sql server中过滤所有没有空值的列

时间:2015-06-29 20:28:51

标签: sql sql-server-2008 sql-server-2012

我有大约20个列,并希望将所有这些列一起过滤,只有'not null'值。有没有办法在sql中执行此操作,因为我不想在查询中提及所有列名。

像这样 -

Select * from table_name where columns IS NOT NULL

1 个答案:

答案 0 :(得分:1)

对于SQL Server,如果您可以处理返回“额外”列,则可以执行以下操作:

 ;WITH xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' AS ns)
  SELECT v.*
    FROM ( SELECT t.*
                , (SELECT t.*
                      FOR xml path('row'), elements xsinil, type
                  ).value('count(//*/@ns:nil)', 'int') AS NullCount
            FROM table_name t
         ) v
   WHERE v.NullCount = 0

我无法将NullCount表达式转换为HAVING子句,这就像我可以接近一样。因此,这会返回一个额外的NullCount列。

在SQL Server 2008上测试

 CREATE TABLE foo
 ( id      INT NULL
 , col2    INT NULL
 , col3    VARCHAR(10) NULL
 , col4    DATE NULL
 , col5    DECIMAL(14,5) NULL
 );

 INSERT INTO foo (id, col2, col3, col4, col5) VALUES
  (1,NULL,NULL,NULL,NULL)
 ,(2,2,'2','2/2/2012',22.22)
 ,(3,3,'3','3/3/2013',333.333)
 ,(4,4,NULL,'4/4/2014',4444.4444)
 ,(5,5,'5',NULL,55555.55555)
 ,(6,6,'6','6/6/2016',NULL)
 ;

 ;WITH xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' AS ns)
  SELECT t.*
       , (SELECT t.*
             FOR xml path('row'), elements xsinil, type
         ).value('count(//*/@ns:nil)', 'int') AS NullCount
    FROM foo t
 ;

 ;WITH xmlnamespaces('http://www.w3.org/2001/XMLSchema-instance' AS ns)
  SELECT v.*
    FROM ( SELECT t.*
                , (SELECT t.*
                      FOR xml path('row'), elements xsinil, type
                  ).value('count(//*/@ns:nil)', 'int') AS NullCount
             FROM foo t
         ) v
   WHERE v.NullCount = 0
 ;