我想获取一个表的行,使得没有列值为null。没有列值的硬编码。我有数百个列名。
输出应该只是第2行,因为所有行都包含所有列的值。我不想指定所有列名称不为null。它应该以编程方式。即使我添加了一个新列,它也可以在不更改查询的情况下工作。这是我的愿景。
答案 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)
答案 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来构建列列表。