2012-12-06 34 views
-2

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

enter image description here

输出应该只有2行,因为所有该行对所有列中的值。我不想指定所有列名不为null。它应该以编程方式。即使我添加一个新的列,它应该工作,而不会改变查询。这是我的愿景。

+0

美好的愿景。你能否也告诉我们你试过了什么? – Raj

+0

“它应该以编程方式。”在MySQL中,pl/sql或tsql?请问一个问题,或者非常相关的问题。在pl/sql中尝试,并在出现问题/错误时提出问题。 –

+0

如果没有在'where'子句中指定每一列,那么你就无法做到这一点,拥有数百个列就是糟糕的设计。 –

回答

0

尝试使用IS NOT NULL

SELECT * FROM table WHERE field_name IS NOT NULL 

欲了解更多信息,与空值工作检查出mysql manual

+0

有100列,我不能指定,我想改变查询时,我添加新的列或删除任何列。所以你的这个查询不会工作。 –

0

试试这个::

SELECT * FROM mytable WHERE column IS NOT NULL 
+0

有100列,我不能指定,也不想改变查询,当我添加新列或删除任何列。所以你的这个查询不会工作。 –

+0

虽然你有100列,但如果你检查表结构的描述,你会发现许多列不为null,选择列的其余部分 –

+0

你可以给你任何意思的例子吗? –

0

试试这个

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

有一百列,我不能指定,我想更改查询时添加新列或删除任何列。所以你的这个查询不会工作。 –

+0

它应该是如果一个或多个列是空的...这发现行1列不为空 –

0

SQL不能单独表达这样的概念。

您必须根据表格定义使用某种过程语言来建立SQL查询。 在Oracle中,您可以使用字典视图USER_TAB_COLUMNS来构建列列表。

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

相关问题