我想获取表的行,使得没有列值为空。没有对列值进行硬编码。我有数百个列名。
输出应该只有第 2 行,因为所有该行都有所有列的值。我不想为 is not null 指定所有列名。它应该以编程方式接受它。即使我添加了一个新列,它也应该可以在不更改查询的情况下工作。那是我的愿景。
我想获取表的行,使得没有列值为空。没有对列值进行硬编码。我有数百个列名。
输出应该只有第 2 行,因为所有该行都有所有列的值。我不想为 is not null 指定所有列名。它应该以编程方式接受它。即使我添加了一个新列,它也应该可以在不更改查询的情况下工作。那是我的愿景。
我发现了一些东西,但这意味着使用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 才是您的结果集,因为只有具有相同外观数量(如表中的列数)的行可能是所有列中所有非空值的行。
尝试这个 ::
SELECT * FROM mytable WHERE column IS NOT NULL
try this
SELECT *
FROM your_table_name
where coalesce(column_1, column_2, column_3, ...., column_n) is not null
仅 SQL 无法表达这样的概念。
您必须使用一些过程语言根据表定义动态地构建 SQL 查询。在 Oracle 中,您可以使用字典视图 USER_TAB_COLUMNS 来构建列列表。