我想获取表的行,使得列值不为空。没有列值的硬编码。我有数百个列名。如何获取其列值不为null的行
输出应该只有2行,因为所有该行对所有列中的值。我不想指定所有列名不为null。它应该以编程方式。即使我添加一个新的列,它应该工作,而不会改变查询。这是我的愿景。
我想获取表的行,使得列值不为空。没有列值的硬编码。我有数百个列名。如何获取其列值不为null的行
输出应该只有2行,因为所有该行对所有列中的值。我不想指定所有列名不为null。它应该以编程方式。即使我添加一个新的列,它应该工作,而不会改变查询。这是我的愿景。
有100列,我不能指定,我想改变查询时,我添加新的列或删除任何列。所以你的这个查询不会工作。 –
试试这个::
SELECT * FROM mytable WHERE column IS NOT NULL
有100列,我不能指定,也不想改变查询,当我添加新列或删除任何列。所以你的这个查询不会工作。 –
虽然你有100列,但如果你检查表结构的描述,你会发现许多列不为null,选择列的其余部分 –
你可以给你任何意思的例子吗? –
试试这个
SELECT *
FROM your_table_name
where coalesce(column_1, column_2, column_3, ...., column_n) is not null
有一百列,我不能指定,我想更改查询时添加新列或删除任何列。所以你的这个查询不会工作。 –
它应该是如果一个或多个列是空的...这发现行1列不为空 –
SQL不能单独表达这样的概念。
您必须根据表格定义使用某种过程语言来建立SQL查询。 在Oracle中,您可以使用字典视图USER_TAB_COLUMNS来构建列列表。
我发现了一些东西,但是这意味着使用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的哪个计数就像列数才是你的结果集,因为只有具有相同外观数目(如表中列数)的行可能是所有列中所有非空值的行。
美好的愿景。你能否也告诉我们你试过了什么? – Raj
“它应该以编程方式。”在MySQL中,pl/sql或tsql?请问一个问题,或者非常相关的问题。在pl/sql中尝试,并在出现问题/错误时提出问题。 –
如果没有在'where'子句中指定每一列,那么你就无法做到这一点,拥有数百个列就是糟糕的设计。 –