Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否仅从表中选择非空的列?_Sql_Sql Server_Tsql - Fatal编程技术网

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) = ''