【问题标题】:Find the count of EMPTY or NULL columns in a MySQL table查找 MySQL 表中 EMPTY 或 NULL 列的计数
【发布时间】:2010-10-28 16:46:11
【问题描述】:

我在一个 MySQL 表中有大约 30 列。我想计算特定行有多少列字段为空。该表用于存储用户信息。我想了解有多少个人资料字段(例如“姓名”、“年龄”、“位置” - 所有这些字段都存储在单独的列中)是空的/尚未由用户填写。

我要细化的列是最后 20 列(因为前 10 列存储用户 ID、密码等内容 - 我只想要存储配置文件信息的最后 20 列)。如何找出此表中空/NULL 列的数量?

【问题讨论】:

  • 如果您给出您希望看到的数据的表格示例,将更容易回答您的问题。

标签: php mysql


【解决方案1】:

如果想法是得到这样的结果:

col       emp    
------    ------    
FName        15  
LName         2  
Age          22 

..使用:

SELECT 'FName' AS col, SUM(CASE FName IS NULL || FName='' THEN 1 ELSE 0 END) as emp FROM MyTable
UNION
SELECT 'LName' AS col, SUM(CASE LName IS NULL || LName='' THEN 1 ELSE 0 END) as emp FROM MyTable
UNION
SELECT 'Age' AS col, SUM(CASE Age IS NULL || Age='' THEN 1 ELSE 0 END) as emp FROM MyTable

...或:

SELECT SUM(CASE t.fname IS NULL OR t.fname = '' THEN 1 ELSE 0 END) AS fname_count,
       SUM(CASE t.lname IS NULL OR t.lname = '' THEN 1 ELSE 0 END) AS lname_count,
       SUM(CASE t.age IS NULL OR t.age = '' THEN 1 ELSE 0 END) AS age_count
  FROM MYTABLE t

【讨论】:

  • +1:但您可以使用单个语句,只需使用要检查的列的名称为该列命名。
  • 这正是我处理类似条件测试的方式......不仅仅是一个空值,而是对 NULL 的显式测试
  • "for a specific row" - 这将显示所有行的总数。
  • 我想找出特定行(即一个用户)的 NULL 或值为 '' 的列数
  • @OMG Ponies:我知道我会踢自己,我明白你的意思,但我这里完全脑部阻塞。可以发个例子吗?
【解决方案2】:

你可以这样计算:

SELECT SUM((`Name` = '') + (`Age` = 0) + (`Location` = '' OR `Location` IS NULL) + ...)

您没有指定您拥有哪些类型的列,因此我使用了不同的比较方法来说明这一点。一般来说,您应该比较特定列值是否等于该字段的默认值(即用户未指定的字段)。 = '' 用于字符串,= 0 用于数字,IS NULL 用于具有默认 NULL 的列等。如果需要,您还可以组合检查 NULL 和空值。这完全取决于您想了解什么。

当然,正如 dnagirl 在她的回答中指出的那样,您应该同时测试空值和 NULL 值,但这实际上取决于您的列的定义方式以及您是否考虑填充空值。我想说明的是,您可以使用SUM 来将布尔表达式结果相加。

编辑:没有注意到你想要每一行。只需删除SUM,您就可以按行获得它。

【讨论】:

  • 有什么办法可以自动完成吗?否则我必须列出超过 20 个列名才能找到 NULL 值
  • @Jamie:如果您要一次又一次地运行它,请编写一个存储过程。是的,您仍然需要列出所有列,但您只需键入一次。
【解决方案3】:

据我了解,您有一张桌子,例如

编号 |姓名 |姓名 |年龄 1 |约翰 | "" |空值 2 |玛丽 |西蒙斯 |空值

你想要:第 1 行有 2 个空/空字段,第 2 行有 1 个空/空字段

选择 ID, IF (FName 为 NULL 或 FName = '', 1, 0) + IF (LName 为 NULL 或 LName = '', 1, 0) + IF (Age IS NULL OR Age = '', 1, 0) 作为 empty_field_count

虽然现在我已经写了这篇文章,但我看到了 Saul 的回复,我认为这可能比这个解决方案有更好的性能。

【讨论】:

    【解决方案4】:

    除了@dnagirl 回答的内容之外,我会考虑做一个额外的步骤......在表中添加一个“anyNulls”列。并将其设置为任何空/空值的标志,这样您就可以快速查询需要完成的数据需求,而不是每个类别的数量。一条记录可能缺少所有字段,而多行中的一列需要修复。

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多