NULL或BLANK字段(ORACLE)

时间:2012-02-06 18:48:33

标签: oracle null

我是Oracle的新手,所以我的问题可能听起来很愚蠢。我确实经历过以前的帖子,但没有运气。 在表中,有一列是空白的,我试图找出列中的空白计数。 我试过了:

SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULL
SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME = ' '
SELECT COUNT (COL_NAME) FROM TABLE WHERE TRIM (COL_NAME)= ' '

上述所有查询的结果为0

然而,当我做的时候

SELECT COL_NAME DUMP (COL_NAME,1016) FROM TABLE

给了我:

COL_NAME       DUMP (COL_NAME,1016)
               NULL
               NULL
               NULL

依旧......

但该列中有数百或数千个空白字段/空字段。任何人都可以帮助我找到该列中空白/空白字段的计数吗? 我正在使用Toad for Oracle 9.0.1.8

9 个答案:

答案 0 :(得分:44)

COUNT(expresion)会返回expresion 非空的行数。因此SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULL将返回0,因为您只计算col_name,其中col_name为空,并且除零之外的任何数字都为零。 COUNT(*)将返回查询的行数:

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL

其他两个查询可能没有返回任何行,因为它们试图匹配具有一个空白字符的字符串,并且转储查询指示该列实际上保留了空值。

如果您想要包含在计数中的包含可变空格字符串的行,请使用:

SELECT COUNT (*) FROM TABLE WHERE trim(COL_NAME) IS NULL

trim(COL_NAME)将删除开始和结束空格。如果字符串只是空格,则字符串变为'',这相当于Oracle中的null。

答案 1 :(得分:9)

NULL列不可数,但是具有NULL列的行是。所以,这应该做你想要的:

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL OR LENGTH(TRIM (COL_NAME)) = 0

请注意,有些非打印字符无法解决。例如,U + 00A0是不间断的空格字符,包含该字符的行在视觉上显示为空,但上述测试无法找到。

答案 2 :(得分:2)

您不能计算空值(至少在Oracle中不计算)。而是尝试这个

SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL

答案 3 :(得分:2)

所以我只是想知道同样的事情,但同时有一个解决方案。我想要一个包含表中所有行并计算空白和非空白的查询。所以我想出了这个。

SELECT COUNT(col_name)                                 VALUE_COUNT
       COUNT(NVL(col_name, 'X') - COUNT(col_name)      NULL_VALUE_COUNT
FROM   table
[CONDITIONS]

您可以计算主键列以获取行总数

,而不是NVL函数

它就像一个魅力

答案 4 :(得分:0)

尝试使用nvl函数。从表中选择count(nvl(col_name,0))。

抱歉,我重读了OP。表格结构是什么?列varchar或char是否会产生影响?

select count(col_name), distinct(col_name) from table group by distinct(col_name)  

/ 不记得你是否需要在小组中有所区别,但我认为不是 /

并查看它是否为您提供了一个空白列名称的返回。

答案 5 :(得分:0)

SELECT COUNT (COL_NAME) 
FROM TABLE 
WHERE TRIM (COL_NAME) IS NULL 
or COL_NAME='NULL'

答案 6 :(得分:0)

DROP TABLE TEST;  -- COMMENT THIS OUT FOR THE FIRST RUN

CREATE TABLE TEST
(
    COL_NAME,
    TEST_NAME
) AS
(
    SELECT      NULL,         'ACTUAL NULL'  FROM DUAL
    UNION ALL
    SELECT      '',           'NULL STRING'  FROM DUAL
    UNION ALL
    SELECT      ' ',          'SINGLE SPACE' FROM DUAL
    UNION ALL
    SELECT      '  ',         'DOUBLE SPACE' FROM DUAL
    UNION ALL
    SELECT      '          ', 'TEN SPACES'   FROM DUAL
    UNION ALL   
    SELECT      'NONSPACE',   'NONSPACES'    FROM DUAL
)
;

SELECT LENGTH(COL_NAME) NUM_OF_SPACES, TEST_NAME
FROM TEST
WHERE LENGTH(COL_NAME) > 0         -- THERE IS SOMETHING IN THE FIELD
  AND TRIM(COL_NAME) IS NULL;      -- WHICH EQUATES TO NULL
  表格TEST掉线了。
   表TEST创建。
   NUM_OF_SPACES TEST_NAME

     
         1 SINGLE SPACE 
         2 DOUBLE SPACE 
        10 TEN SPACES

一旦确定了包含空格的列,请将该查询包装在计数中。 如果您确实需要识别某些更新的字段,请考虑选择ROWID。

答案 7 :(得分:0)

一个人永远不应该对待“BLANK”而NULL也是如此。

回到有过SQL标准的前几天,Oracle做出了设计决定,即VARCHAR / VARCHAR2列中的空字符串为NULL,并且只有一种NULL感(有关系理论家可以区分数据,从来没有被提示过,答案存在但用户不知道的数据,没有答案的数据等,所有这些都构成了一种空的感觉。当SQL标准出现并同意NULL和空字符串是不同的实体时,已经有Oracle用户拥有代码,假设这两者是等价的。因此Oracle基本上选择了破坏现有代码,违反SQL标准或引入某种初始化参数来改变潜在大量查询的功能。违反SQL标准(恕我直言)是这三个选项中破坏性最小的。

Oracle已经开放了VARCHAR数据类型在未来版本中将改变以遵守SQL标准的可能性(这就是为什么每个人都在Oracle中使用VARCHAR2,因为该数据类型的行为保证在未来保持不变)。

答案 8 :(得分:-3)

首先,你知道“空白”和“空白”是两个完全不同的东西?正确的吗?

第二:在大多数编程语言中,“”表示“空字符串”。零长度字符串。没有人物。

SQL不一定像那样工作。如果我定义一个列“name char(5)”,那么“空白”名称将为" "(5个空格)。

听起来你可能想要这样的东西:

select count(*) from my_table where Length(trim(my_column)) = 0;

“Trim()”是您可以在PL / SQL中使用的众多Oracle功能之一。它记录在这里:

http://www.techonthenet.com/oracle/functions/trim.php

'希望有所帮助!