【问题标题】:How to get rows whose columns values are not null如何获取列值不为空的行
【发布时间】:2012-11-24 03:13:25
【问题描述】:

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

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

【问题讨论】:

  • 美好的愿景。你能告诉我们你尝试了什么吗?
  • “它应该以编程方式获取它。”。在 mysql、pl/sql 或 tsql 中?请提出一个问题,或非常相关的问题。在 pl/sql 中尝试,遇到问题/错误时提出问题。
  • 如果不指定 'where' 子句中的每一列,你就无法做到这一点,拥有数百列只是糟糕的设计。

标签: mysql sql sql-server oracle tsql


【解决方案1】:

我发现了一些东西,但这意味着使用 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 才是您的结果集,因为只有出现次数相同的行(如表中的列数)才可能是所有列中所有非空值的行。

【讨论】:

    【解决方案2】:

    单独的 SQL 无法表达这样的概念。

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

    【讨论】:

      【解决方案3】:

      试试这个

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

      【讨论】:

      • 当我添加新列或删除任何列时,我无法指定数百列,也不想更改查询。所以你的这个查询是行不通的。
      • 它应该是如果一个或多个列为空...这会找到1列不为空的行
      【解决方案4】:

      尝试使用IS NOT NULL

      SELECT * FROM table WHERE field_name IS NOT NULL
      

      有关更多信息,请查看mysql manual 中关于使用空值的内容。

      【讨论】:

      • 当我添加新列或删除任何列时,我无法指定数百列,也不想更改查询。所以你的这个查询是行不通的。
      【解决方案5】:

      试试这个 ::

      SELECT * FROM mytable WHERE column IS NOT NULL
      

      【讨论】:

      • 当我添加新列或删除任何列时,我无法指定数百列,也不想更改查询。所以你的这个查询是行不通的。
      • 虽然你有100列,但是如果你检查表结构的描述,你会发现很多列不为空,选择剩下的列
      • 你能举个例子来说明你的意思吗?
      • 在您的 MYSQL 查询浏览器中运行此查询:Show create table yourTableName
      • 我的意思是我需要一个查询来获取该行的所有列值都不应该为空的行。我该怎么做?
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2012-04-24
      • 2018-09-15
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多