-1

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

在此处输入图像描述

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

4

5 回答 5

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 才是您的结果集,因为只有具有相同外观数量(如表中的列数)的行可能是所有列中所有非空值的行。

于 2012-12-06T11:42:16.893 回答
1

尝试这个 ::

SELECT * FROM mytable WHERE column IS NOT NULL
于 2012-12-06T05:53:57.110 回答
0

try this

SELECT * 
FROM your_table_name
where coalesce(column_1, column_2, column_3, ...., column_n) is not null 
于 2012-12-06T05:58:57.327 回答
0

仅 SQL 无法表达这样的概念。

您必须使用一些过程语言根据表定义动态地构建 SQL 查询。在 Oracle 中,您可以使用字典视图 USER_TAB_COLUMNS 来构建列列表。

于 2012-12-06T09:28:04.787 回答
-1

尝试使用IS NOT NULL

SELECT * FROM table WHERE field_name IS NOT NULL

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

于 2012-12-06T05:53:24.603 回答