2012-02-06 59 views
25

我是Oracle新手,所以我的問題聽起來可能很愚蠢。我確實經歷過以前的帖子,但沒有運氣。 在表中,有一列是空白的,我試圖找出列中的空白計數。 我想:NULL或BLANK字段(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

+3

在Oracle NULL和''(空字符串)是等價的。另見http://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as-null – 2012-02-06 19:04:19

回答

0

嘗試使用nvl函數。從表中選擇count(nvl(col_name,0))。

對不起,我重讀了OP。什麼是表結構?是列的varchar或字符,因爲這將有所作爲?

嘗試

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

/不記得,如果你的組需要不同的,但我想不會/

,看看它是否爲您提供了一個列名即返回空白。

-3

首先,你知道「空白」和「空」是兩個完全不同的東西?正確?第二:在大多數編程語言中,「」表示「空字符串」。一個零長度的字符串。沒有字符。

SQL不一定像那樣工作。如果我定義了一個「name char(5)」列,那麼一個「空白」名稱將是" "(5個空格)。

這聽起來像你可能想是這樣的:

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

「TRIM()」是的,你可以在PL/SQL中使用甲骨文的許多功能之一。它在這裏記載:

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

「希望幫助!

+1

在Oracle中,一個空字符串與null相同。除此之外,這意味着您提供的查詢將不起作用,因爲它將以「trim(my_column)= null」的形式解析,而這總是假的。 – Allan 2012-02-06 19:04:53

+0

@Allan - 不,「NULL」和「空字符串」在C中,C++中,Java中,C#中和SQL中是兩個完全不同的東西。這裏有一個從「Ask Tom」的鏈接(Tom @ Kyte,@Oracle副總裁):http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5984520277372 – paulsm4 2012-02-06 19:23:15

+0

PS:我修改了我的帖子,以便它可以與所有的Oracle,MSSQL,MySQL和DB2一起工作 – paulsm4 2012-02-06 19:27:37

2

您不能計算空值(至少不在Oracle中)。請嘗試此操作

SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL 
9

NULL列不可計數,但是具有NULL列的行是。所以,這應該做你想找的東西:

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

請注意,有非打印字符,這將不會解決。例如,U + 00A0是非破壞性空格字符,並且包含該字符的行在視覺上將顯示爲空,但不會通過上述測試找到。

40

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。

+4

很好的回答(+1)。順便提一句,Oracle的字符串類型被命名爲「VARCHAR2」,因爲它的行爲,並將繼續以非標準方式行事(即將NULL等同於空字符串)。 VARCHAR雖然目前與VARCHAR2相同,但將來可能會以更標準的方式運行(即區分NULL和空字符串)。 – 2012-02-07 23:39:29

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

是答案嗎?如果是的話,請解釋你在做什麼,並設置代碼的格式。 – stefan 2013-06-16 10:09:04

2

所以我只是想知道同樣的,但同時有一個解決方案。我想要一個包含表中所有行的查詢,並計算空白和非空白。所以我想出了這個。

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

代替NVL功能,你可以指望的主鍵列,以獲得行

的總數它的工作原理就像一個魅力

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。

0

一個不應該把「空白」和NULL有相同的。

早在SQL標準出現之前,Oracle就做出了設計決定,即VARCHAR/VARCHAR2列中的空字符串爲NULL,並且只有一種NULL意義(有關係理論家可以區分數據從未被提示過的數據,存在答案但用戶不知道的數據,沒有答案的數據等等,所有這些都構成NULL的感覺)。當SQL標準出現並同意NULL和空字符串是不同的實體時,已經有Oracle用戶認爲這兩個代碼是相同的。因此,Oracle基本上只剩下打破現有代碼,違反SQL標準或引入某種初始化參數的選項,這些參數可能會改變潛在的大量查詢的功能。違反SQL標準(恕我直言)是這三種選擇中最不具有破壞性的。

Oracle在未來版本中將VARCHAR數據類型更改爲遵守SQL標準的可能性(這就是爲什麼每個人都使用Oracle中的VARCHAR2的原因,因爲該數據類型的行爲將保持不變) 。

相關問題