web-dev-qa-db-ja.com

NULLまたはBLANKフィールド(Oracle)

私は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

等々..

しかし、その列には何百または何千もの空白フィールド/空のフィールドがあります。誰でも私がその列の空白/空のフィールドのcountを見つけるのを手伝ってくれますか? Toad for Oracle 9.0.1.8を使用しています

30
user1192996

COUNT(expresion)は、expresionnullではないである行のカウントを返します。したがって、col_nameがnullで、null以外のカウントはゼロであるcol_nameのみをカウントしているため、SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULLは0を返します。 COUNT(*)は、クエリの行数を返します。

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL

他の2つのクエリは、1つの空白文字を含む文字列との照合を試みているため、おそらく行を返していません。ダンプクエリは、列が実際にnullを保持していることを示します。

カウントに含めるスペース文字の可変文字列を含む行がある場合は、次を使用します。

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

trim(COL_NAME)は、開始スペースと終了スペースを削除します。文字列がスペース以外の場合、文字列は''になります。これは、Oracleのnullと同等です。

45

NULL列はカウントできませんが、NULL列を持つ行はカウントできます。したがって、これはあなたが探していることをするはずです:

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

これが対処しない非印刷文字があることに注意してください。たとえば、U + 00A0は改行しないスペース文字であり、それを含む行は視覚的には空に見えますが、上記のテストでは検出されません。

9
Devon_C_Miller

だから私は同じことについて疑問に思ったが、同時にこれに対する解決策を持っていた。テーブル内のすべての行を含み、空白と非空白の両方をカウントするクエリが必要でした。それで私はこれを思いつきました。

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

NVL関数の代わりに、主キー列をカウントして、行の総数を取得できます

それは魅力のように機能します

2
ebbie73

Nullをカウントすることはできません(少なくともOracleでは)。代わりにこれを試してください

SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL
2
Roger Lindsjö
SELECT COUNT (COL_NAME) 
FROM TABLE 
WHERE TRIM (COL_NAME) IS NULL 
or COL_NAME='NULL'
1
George Janga
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が削除されました。
table TESTが作成されました。
NUM_OF_SPACES TEST_NAME


         1 SINGLE SPACE 
         2 DOUBLE SPACE 
        10 TEN SPACES

空白を含む列を特定したら、そのクエリをカウントでラップします。何らかの更新のフィールドを実際に識別する必要がある場合は、ROWIDも選択することを検討してください。

0
EvilTeach

「BLANK」は絶対に扱わないでください。NULLも同じです。

SQL標準が登場する以前の時代、OracleはVARCHAR/VARCHAR2列の空の文字列はNULLであり、NULLの意味は1つだけであるという設計上の決定を下しました(これまでになかったデータを区別するリレーショナル理論家がいますプロンプトが表示され、回答は存在するがユーザーが知らないデータ、回答が存在しないデータなどがあります。これらはすべてNULLの感覚を構成します。 SQL標準が登場し、NULLと空の文字列が別個のエンティティであることに同意するまでに、2つが同等であると想定したコードを持つOracleユーザーが既に存在していました。そのため、Oracleには、基本的に、既存のコードを壊す、SQL標準に違反する、または潜在的に多数のクエリの機能を変更する何らかの初期化パラメーターを導入するオプションが残されていました。 SQL標準(IMHO)に違反することは、これら3つのオプションの中で最も破壊的ではありませんでした。

Oracleは、VARCHARデータ型が将来のリリースでSQL標準に準拠するように変更される可能性を残しました(これは、そのデータ型の動作が今後も同じままであることが保証されているため、誰もがOracleでVARCHAR2を使用する理由です)。

0
paulsm4

Nvl関数を試してください。テーブルからcount(nvl(col_name、0))を選択します。

申し訳ありませんが、OPを読み直しました。テーブル構造とは何ですか?列varcharまたはcharは違いを生むのですか?

試してみる

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

/ グループ内で個別に必要な場合は覚えていないが、そうは思わない /

空白の列名でリターンが返されるかどうかを確認します。

0
Brian