Sql 是否仅从表中选择非空的列?
我有一个包含数百列的表:Sql 是否仅从表中选择非空的列?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含数百列的表: ------------------------------------------------ ID ColA ColB ColC Col D ... ColZZZ ------------------------------------------------ 1 bla 2 foo 3 bar 4 baz ------
------------------------------------------------
ID ColA ColB ColC Col D ... ColZZZ
------------------------------------------------
1 bla
2 foo
3 bar
4 baz
------------------------------------------------
我需要知道哪些列中没有值,即:哪些是空的,哪些不是空的
我可以为每个列创建一个查询:
select count(1) from [table] where [ColA] <> ''; -- returns 2, so not, not empty
select count(1) from [table] where [ColB] <> ''; -- returns 1, so no
select count(1) from [table] where [ColC] <> ''; -- returns 0, so yay! found and empty one
...
etc
这里有一个解决方案。在搜索所有表中的空列之前,我使用了这个查询。现在稍微修改以搜索非空,在您的示例中可能不需要额外的部分 您可以创建一个临时表来存储非空的列名,并使用游标创建动态sql来搜索它们 最后,只需生成另一个动态sql,根据临时表结果选择列
IF (OBJECT_ID('tempdb..#tmpRez') IS NOT NULL) DROP TABLE #tmpRez;
CREATE TABLE #tmpRez (TableName sysname, ColName sysname);
DECLARE crs CURSOR LOCAL FAST_FORWARD FOR
SELECT t.name, c.name FROM sys.tables t
INNER JOIN sys.columns c ON c.object_id=t.object_id
WHERE 1=1
AND t.name = 'Table1' -- OR your own condition
OPEN crs;
DECLARE @tbl sysname;
DECLARE @col sysname;
DECLARE @sql NVARCHAR(MAX);
FETCH NEXT FROM crs INTO @tbl,@col;
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = 'IF EXISTS (SELECT * FROM ['+ @tbl+'] WHERE [' + @col + '] <> '''') INSERT INTO #tmpRez SELECT ''' + @tbl +''','''+ @col + '''';
EXEC(@sql);
FETCH NEXT FROM crs INTO @tbl,@col;
END;
CLOSE crs;
DEALLOCATE crs;
SELECT @sql = 'SELECT ' + STUFF((SELECT ',' + ColName FROM #tmpRez x
where x.TableName = y.TableName
FOR XML PATH ('')), 1, 1, '') + ' FROM ' + TableName
FROM #tmpRez y GROUP BY TableName
EXEC (@sql)
返回不含空列的表如何:
SELECT * from table
WHERE column IS NOT NULL AND TRIM(column) <> ''
SELECT * from table
WHERE column IS NULL AND TRIM(column) = ''
不可以。SQL查询有一组固定的列。您不能有条件地选择整列。因此,我必须逐个选择这些列,注意其中的空列,然后构建下一个查询,而不将这些列添加到select或where子句中?我愿意这样做,但不应该有一种方法来动态地这样做吗?可以使用system view sys.colums上的光标来动态地完成。。。我已经做了类似的事情,寻找空列,我会尝试找到它,并重写它作为例子…非常感谢!但是我是否正确,这只在列具有空值时才起作用,而它们从来没有这样做过,相反,将有一个空字符串。@Pr0no-是的,您是对的-现在对它进行了修改以查找空字符串
SELECT * from table
WHERE column IS NULL AND TRIM(column) = ''