web-dev-qa-db-fra.com

Champs NULL ou BLANK (Oracle)

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

30
user1192996

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_namecol_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.

45
Shannon Severance

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.

9
Devon_C_Miller

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

2
ebbie73

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

table TEST abandonnée.
table TEST créée.
NUM_OF_SPACES TEST_NAME


         1 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.

0
EvilTeach

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).

0
paulsm4

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.

0
Brian