我有大约20个列,并希望将所有这些列一起过滤,只有'not null'值。有没有办法在sql中执行此操作,因为我不想在查询中提及所有列名。
像这样 -
Select * from table_name where columns IS NOT NULL
答案 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
;