私は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を使用しています
COUNT(expresion)
は、expresion
がnullではないである行のカウントを返します。したがって、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と同等です。
NULL列はカウントできませんが、NULL列を持つ行はカウントできます。したがって、これはあなたが探していることをするはずです:
SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL OR LENGTH(TRIM (COL_NAME)) = 0
これが対処しない非印刷文字があることに注意してください。たとえば、U + 00A0は改行しないスペース文字であり、それを含む行は視覚的には空に見えますが、上記のテストでは検出されません。
だから私は同じことについて疑問に思ったが、同時にこれに対する解決策を持っていた。テーブル内のすべての行を含み、空白と非空白の両方をカウントするクエリが必要でした。それで私はこれを思いつきました。
SELECT COUNT(col_name) VALUE_COUNT
COUNT(NVL(col_name, 'X') - COUNT(col_name) NULL_VALUE_COUNT
FROM table
[CONDITIONS]
NVL関数の代わりに、主キー列をカウントして、行の総数を取得できます
それは魅力のように機能します
Nullをカウントすることはできません(少なくともOracleでは)。代わりにこれを試してください
SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL
SELECT COUNT (COL_NAME)
FROM TABLE
WHERE TRIM (COL_NAME) IS NULL
or COL_NAME='NULL'
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_NAME1 SINGLE SPACE 2 DOUBLE SPACE 10 TEN SPACES
空白を含む列を特定したら、そのクエリをカウントでラップします。何らかの更新のフィールドを実際に識別する必要がある場合は、ROWIDも選択することを検討してください。
「BLANK」は絶対に扱わないでください。NULLも同じです。
SQL標準が登場する以前の時代、OracleはVARCHAR/VARCHAR2列の空の文字列はNULLであり、NULLの意味は1つだけであるという設計上の決定を下しました(これまでになかったデータを区別するリレーショナル理論家がいますプロンプトが表示され、回答は存在するがユーザーが知らないデータ、回答が存在しないデータなどがあります。これらはすべてNULLの感覚を構成します。 SQL標準が登場し、NULLと空の文字列が別個のエンティティであることに同意するまでに、2つが同等であると想定したコードを持つOracleユーザーが既に存在していました。そのため、Oracleには、基本的に、既存のコードを壊す、SQL標準に違反する、または潜在的に多数のクエリの機能を変更する何らかの初期化パラメーターを導入するオプションが残されていました。 SQL標準(IMHO)に違反することは、これら3つのオプションの中で最も破壊的ではありませんでした。
Oracleは、VARCHARデータ型が将来のリリースでSQL標準に準拠するように変更される可能性を残しました(これは、そのデータ型の動作が今後も同じままであることが保証されているため、誰もがOracleでVARCHAR2を使用する理由です)。
Nvl関数を試してください。テーブルからcount(nvl(col_name、0))を選択します。
申し訳ありませんが、OPを読み直しました。テーブル構造とは何ですか?列varcharまたはcharは違いを生むのですか?
試してみる
select count(col_name), distinct(col_name) from table group by distinct(col_name)
/ グループ内で個別に必要な場合は覚えていないが、そうは思わない /
空白の列名でリターンが返されるかどうかを確認します。