如何获取列值不为null的行

时间:2012-12-06 05:51:43

标签: mysql sql sql-server oracle tsql

我想获取一个表的行,使得没有列值为null。没有列值的硬编码。我有数百个列名。

enter image description here

输出应该只是第2行,因为所有行都包含所有列的值。我不想指定所有列名称不为null。它应该以编程方式。即使我添加了一个新列,它也可以在不更改查询的情况下工作。这是我的愿景。

5 个答案:

答案 0 :(得分:2)

我找到了一些东西,但这意味着使用 CURSOR

DECLARE @ColumnName VARCHAR(200)
DECLARE @ColumnCount INT
DECLARE @sql VARCHAR(400)

CREATE TABLE #tempTable (Id INT)

DECLARE GetNonNullRows CURSOR 
FOR 
    SELECT c.NAME, (SELECT COUNT(*) FROM sys.columns col WHERE col.object_id = c.OBJECT_ID)  FROM sys.tables AS t
    JOIN sys.columns AS c ON t.object_id = c.object_id
    WHERE t.name = 'SomeTable' AND t.type = 'U'

OPEN GetNonNullRows
FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'SELECT st.UniqueId FROM SomeTable AS st WHERE ' + CONVERT(varchar, @ColumnName) + ' IS NOT NULL'    
    INSERT INTO #tempTable
    EXEC (@sql)

FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
END 

CLOSE GetNonNullRows
DEALLOCATE GetNonNullRows

SELECT * FROM SomeTable AS st1
WHERE st1.UniqueId IN (SELECT Id FROM #tempTable AS tt
GROUP BY Id
HAVING COUNT(Id) = @ColumnCount)


DROP TABLE #tempTable

让我稍微解释一下。

首先我创建一个迭代一个表的所有列的游标。对于每一列,我都创建了sql脚本来在表中搜索所选列的非空值。对于满足条件的那些行,我将获取其唯一ID并放入临时表,并且我将对所有列使用此作业。

最后,只有ID的列数与列数相似才是结果集,因为只有具有相同数量的外观的行(如表中的列数)可能是所有列中所有非空值的行。

答案 1 :(得分:0)

尝试使用IS NOT NULL

SELECT * FROM table WHERE field_name IS NOT NULL

有关更多信息,请查看有关使用空值的mysql manual

答案 2 :(得分:0)

试试这个::

SELECT * FROM mytable WHERE column IS NOT NULL

答案 3 :(得分:0)

试试这个

SELECT * 
FROM your_table_name
where coalesce(column_1, column_2, column_3, ...., column_n) is not null 

答案 4 :(得分:0)

单凭SQL无法表达这样的概念。

您必须使用某种过程语言根据表定义以动态方式构建SQL查询。 在Oracle中,您可以使用dictionay视图USER_TAB_COLUMNS来构建列列表。