SQL仅选择非空列

SQL仅选择非空列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,SQL Server 2008表中有25列,我只需要选择不为空的单元格。到目前为止,我已经尝试了Where条件,如: Select * from TableNmae where ColumnA is not like '% %' and ColumnB is not like '% %' ,etc... 我还对所有列尝试了Union和Union-All,但其中的non只返回给定条件下的非空单元格 Select * from TableNmae where ColumnA is

SQL Server 2008表中有25列,我只需要选择不为空的单元格。到目前为止,我已经尝试了
Where
条件,如:

Select * 
from TableNmae 
where ColumnA is not like '% %' 
  and  ColumnB is not like '% %' ,etc...
我还对所有列尝试了
Union
Union-All
,但其中的non只返回给定条件下的非空单元格

Select * 
from TableNmae 
where ColumnA is not null
and  ColumnB is not null ...

除非它是数字数据类型,否则您必须将isnull设置为0或转换/转换为varchar数据类型。

您可以使用isnull这样做

选择*
来自TableNmae
其中IsNull(ColumnA,“”)
和IsNull(ColumnA,“)”…

这个地址也应该是null和空的。这将返回不包含所有空列的行。
如果您的问题是使用一条select语句仅返回行中的非空列,那么这是无法做到的。

为了使用索引(如果存在),我将按如下方式编写:

Select * 
From TableName 
Where ColumnA Is Not NULL And ColumnA <> '' 
  And ColumnB Is Not NULL And ColumnB <> ''
.......
选择*
从表名
其中ColumnA不为NULL且ColumnA为“”
ColumnB不为NULL,ColumnB为“”
.......

如果不想基于行,可以将一组单独的列计算合并在一起:

SELECT 'ColumnA' AS ColumnName, ColumnA AS ColumnValue
FROM TableName
WHERE NOT ColumnA IS NULL

UNION ALL

SELECT 'ColumnB' AS ColumnName, ColumnB AS ColumnValue
FROM TableName
WHERE NOT ColumnB IS NULL

UNION ALL

-- etc....

其他一些答案也显示了更灵活的使用IsNull的方法来帮助剔除空值和空值…在这里添加这一点也很好。您可能还希望从表中选择键字段,以便标识源行。

Empty?你的意思是NULL,还是长度值为零?您只能选择已定义的行,所以如果一个值为空,您希望做什么?它们是nvarchar类型,所以我的意思是不为Null。我只需要从一行中选择Only和Only not null单元格。Is not null代替likeSo zero length表示“空”?在sql中不选择“cells”—选择列并返回行。您的要求没有真正意义,除非您的意思是希望过滤查询以仅返回包含非空单元格的行?这正是我的问题“使用一个select语句仅返回行中的非空列,这是不可能的。”我可以使用循环并将结果插入临时表吗?是和否,这取决于您希望输出的方式,是否希望所有列都作为输出中的一列。如果一行中有多个列的数据,该怎么办?问题要求“选择不为空的单元格”,而一个仅为空的答案被否决?用+1为您平衡,但严格地说,您不是在检查“不为空”,而是在检查“不为空”。不过,OP并不十分清楚。
SELECT 'ColumnA' AS ColumnName, ColumnA AS ColumnValue
FROM TableName
WHERE NOT ColumnA IS NULL

UNION ALL

SELECT 'ColumnB' AS ColumnName, ColumnB AS ColumnValue
FROM TableName
WHERE NOT ColumnB IS NULL

UNION ALL

-- etc....