在MySQL表中查找EMPTY或NULL列的计数

时间:2010-10-28 16:46:11

标签: php mysql

我在MySQL表中有大约30列。我想计算特定行的列数字段是空的。该表用于存储用户信息。我想知道有多少个配置文件字段(例如“名称”,“年龄”,“位置” - 所有这些都存储在一个单独的列中)是空的/尚未被用户填写。

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

4 个答案:

答案 0 :(得分:4)

您可以像这样计算:

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

您没有指定您拥有的列类型,因此我使用了不同的比较方法来说明这一点。作为一般概念,您应该比较以查看特定列值是否等于该字段的默认值(即,用户未指定的字段)。使用= ''表示字符串,= 0表示数字,IS NULL表示具有默认NULL等的列。如果需要,还可以组合检查NULL和空值。这一切都取决于你想要找到的东西。

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

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

答案 1 :(得分:4)

如果想要得到这样的结果:

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

答案 2 :(得分:2)

根据我的理解,你有一个表格,如

id | FName | LName  | Age
1  | John  | ""     | NULL
2  | Mary  | Simons | NULL

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

SELECT
    id,

    IF (FName IS NULL OR FName = '', 1, 0) + 
    IF (LName IS NULL OR LName = '', 1, 0) + 
    IF (Age IS NULL OR Age = '', 1, 0)
    as empty_field_count

虽然现在我写了这篇文章但我看到了Saul的回应,我认为这个解决方案可能会有更好的表现。

答案 3 :(得分:1)

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