1

我有一个像这样的查询

select *
from tableName
where x='3'

这给了我一些结果,但我不想看到每行都为 Null 的任何列。有没有一种简单的方法可以过滤掉这些?

4

2 回答 2

5

不,没有。

你所追求的是一些语法,比如

select <column list::filter(where all rows are NULL)>

但是,这没有任何意义。不是一般意义上的。在 SSMS 或一次性查询工具中使用它可能看起来很酷,但对于 Joe Public 在 ASP.Net 等程序中的日常使用,谁会想要不可预测的列数?

现在,如果您真的想这样做,可以使用动态 SQL 来实现,但是您必须以这种方式查询它必须编码为 ONCE-PER-TABLE。

于 2013-04-22T21:43:42.000 回答
2

您可以使用动态 SQL 尝试一些疯狂的东西,但我真的不推荐这样做。

此查询检查前两列是否都具有空值,然后将它们添加到 select 语句。如果你真的想这样做,你可以对表中的所有列都使用相同的方法。

DECLARE @sql nvarchar(1000)
DECLARE @columnList nvarchar(1000)
SET @columnList = ''

DECLARE @tableRowCount int
DECLARE @columnRowCount int

SET @tableRowCount = (select COUNT(*) from tableName)

SET @columnRowCount = (select COUNT(*) from tableName where column1 is null)
IF @tableRowCount <> @columnRowCount 
    SET @columnList = @columnList + 'column1, '

SET @columnRowCount = (select COUNT(*) from tableName where column2 is null)
IF @tableRowCount <> @columnRowCount 
    SET @columnList = @columnList + 'column2, '


IF LEN(@columnList) > 0
    SET @sql = 'SELECT ' + SUBSTRING(@columnList,1, LEN(@columnList) - 1) + ' FROM tableName'
ELSE
    SET @sql = 'SELECT * FROM tableName'

EXEC(@sql)
于 2013-04-23T09:24:03.347 回答