Je suis nouveau dans Oracle, alors ma question peut paraître stupide. Je suis passé par les messages précédents, mais pas de chance. Dans la table, il y a une colonne qui est vide et j'essaie de trouver le nombre de blancs dans la colonne. J'ai essayé:
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)= ' '
Le résultat pour toutes les requêtes ci-dessus est 0
Cependant, quand j'ai fait
SELECT COL_NAME DUMP (COL_NAME,1016) FROM TABLE
m'a donné:
COL_NAME DUMP (COL_NAME,1016)
NULL
NULL
NULL
etc..
Mais il y a des centaines ou des milliers de champs vides/champs vides dans cette colonne. Quelqu'un peut-il m'aider à trouver count parmi les champs vides/vides de cette colonne? J'utilise Toad pour Oracle 9.0.1.8
COUNT(expresion)
renvoie le nombre de lignes où expresion
est non nul. Donc, SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULL
renverra 0, car vous ne comptez que col_name
Où col_name
Est nul et le nombre de rien à part les valeurs nulles est égal à zéro. COUNT(*)
retournera le nombre de lignes de la requête:
SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL
Les deux autres requêtes ne renvoient probablement aucune ligne, car elles essaient de faire correspondre des chaînes avec un caractère vide et votre requête de vidage indique que la colonne contient en réalité des valeurs NULL.
Si vous souhaitez inclure des lignes avec des chaînes variables de caractères d'espace, utilisez:
SELECT COUNT (*) FROM TABLE WHERE trim(COL_NAME) IS NULL
trim(COL_NAME)
supprimera les espaces de début et de fin. Si la chaîne n'est rien d'autre que des espaces, elle devient ''
, Ce qui équivaut à null dans Oracle.
Une colonne NULL n'est pas dénombrable. Cependant, une ligne comportant une colonne NULL l'est. Donc, cela devrait faire ce que vous cherchez:
SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL OR LENGTH(TRIM (COL_NAME)) = 0
Notez qu'il existe des caractères non imprimables que cela ne traitera pas. Par exemple, U + 00A0 est le caractère d’espace insécable et une ligne contenant ce qui apparaîtra visuellement vide, mais ne sera pas trouvée par les tests ci-dessus.
Alors je me posais simplement la même question, mais j'avais en même temps une solution à cela. Je voulais une requête qui incluait toutes les lignes de la table et comptait à la fois les blancs et les non blancs. Alors je suis venu avec cela.
SELECT COUNT(col_name) VALUE_COUNT
COUNT(NVL(col_name, 'X') - COUNT(col_name) NULL_VALUE_COUNT
FROM table
[CONDITIONS]
Au lieu de la fonction NVL, vous pouvez compter la colonne de clé primaire pour obtenir le nombre total de lignes.
Il fonctionne comme un charme
Vous ne pouvez pas compter les valeurs NULL (du moins dans Oracle). Au lieu d'essayer ceci
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
table TEST abandonnée.
table TEST créée.
NUM_OF_SPACES TEST_NAME1 SINGLE SPACE 2 DOUBLE SPACE 10 TEN SPACES
Une fois que vous avez identifié les colonnes contenant des blancs, encapsulez cette requête. Si vous devez réellement identifier les champs pour une mise à jour, envisagez également de sélectionner le ROWID.
On ne devrait JAMAIS traiter "BLANK" et NULL a le même.
À l’époque antérieure à l’instauration d’un standard SQL, Oracle avait décidé que les chaînes vides des colonnes VARCHAR/VARCHAR2 étaient NULL et qu’il n’y avait qu’un seul sens de NULL (il existe des théoriciens relationnels qui différencient des données qui n’ont jamais été demandé, données pour lesquelles la réponse existe mais que l’utilisateur ne connaît pas, données pour lesquelles il n’ya pas de réponse, etc., qui constituent toutes un certain sens de la valeur NULL). Au moment où la norme SQL est arrivée et a convenu que NULL et la chaîne vide étaient des entités distinctes, il existait déjà des utilisateurs d'Oracle dont le code supposait que les deux étaient équivalents. Donc, Oracle avait essentiellement la possibilité de rompre le code existant, de violer le standard SQL ou d'introduire une sorte de paramètre d'initialisation qui modifierait les fonctionnalités d'un nombre potentiellement important de requêtes. Violer le standard SQL (IMHO) était le moins perturbant de ces trois options.
Oracle a laissé ouverte la possibilité que le type de données VARCHAR soit modifié dans une version ultérieure pour se conformer au standard SQL (raison pour laquelle tout le monde utilise VARCHAR2 dans Oracle, car le comportement de ce type de données reste identique à l'avenir).
Essayez la fonction nvl. sélectionnez count (nvl (nom_colonne, 0)) dans la table.
Désolé, j'ai relu l'OP. Quelle est la structure de la table? est la colonne varchar ou char car cela fera une différence?
essayer
select count(col_name), distinct(col_name) from table group by distinct(col_name)
/ je ne me souviens pas si vous avez besoin de distinct dans le groupe mais je ne le pense pas /
et voyez si cela vous donne une déclaration avec un nom de colonne vide.