我是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
答案 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
'希望有所帮助!