Подтвердить что ты не робот

Поля 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 для Oracle 9.0.1.8

4b9b3361

Ответ 1

COUNT(expresion) возвращает количество строк, где expresion не null. Таким образом, SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULL вернет 0, потому что вы считаете только col_name, где col_name равно null, а количество ничего, кроме нулей, равно нулю. COUNT(*) вернет количество строк запроса:

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL

Другие два запроса, вероятно, не возвращают никакие строки, поскольку они пытаются сопоставлять строки с одним пустым символом, а ваш запрос дампа указывает, что столбец фактически содержит нули.

Если у вас есть строки с переменными строками пробелов, которые вы хотите включить в счет, используйте:

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

trim(COL_NAME) удаляет начальные и конечные пробелы. Если строка - это ничего, кроме пробелов, то строка становится '', которая эквивалентна null в Oracle.

Ответ 2

Столбец NULL не является счетным, однако строка с столбцом NULL. Итак, это должно делать то, что вы ищете:

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

Обратите внимание, что есть непечатаемые символы, которые не будут обрабатываться. Например, U + 00A0 является неразрывным символом пробела, а строка, содержащая это, будет визуально казаться пустой, но не будет найдена в результате вышеприведенных тестов.

Ответ 3

Вы не можете считать нули (по крайней мере, не в Oracle). Вместо этого попробуйте

SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL

Ответ 4

Итак, я просто подумал об одном и том же, но имел в то же время решение этого. Мне нужен запрос, который включал все строки в таблицу и считал как пробелы, так и незаполненные пробелы. Поэтому я придумал это.

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

Вместо функции NVL вы можете подсчитать столбец первичного ключа, чтобы получить общее количество строк

Он работает как шарм

Ответ 5

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

Ответ 6

Попробуйте функцию nvl. выберите count (nvl (col_name, 0)) из таблицы.

Извините, я перечитал OP. Какова структура таблицы? является столбцом varchar или char, так как это будет иметь значение?

попробовать

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

/не помню, если вам нужна отдельная группа, но я думаю, что нет /

и посмотрите, дает ли он вам сообщение с пустым столбцом.

Ответ 7

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.

Ответ 8

НИКОГДА не следует рассматривать "ПУСТО" и "НУЛЬ" как одно и то же.

В прежние времена, когда существовал стандарт SQL, Oracle приняла решение о том, что пустые строки в столбцах VARCHAR/VARCHAR2 имеют значение NULL и что существует только одно значение NULL (существуют реляционные теоретики, которые различают данные, которые никогда не были запрашивается, данные, где ответ существует, но не известен пользователю, данные, где ответа нет и т.д., все из которых составляют некоторое значение NULL) К тому времени, когда стандарт SQL пришел и согласился, что NULL и пустая строка были различными объектами, уже были пользователи Oracle, у которых был код, который предполагал, что оба были эквивалентны. Таким образом, у Oracle остались возможности нарушить существующий код, нарушить стандарт SQL или ввести какой-либо параметр инициализации, который изменит функциональность потенциально большого количества запросов. Нарушение стандарта SQL (IMHO) было наименее разрушительным из этих трех вариантов.

Oracle оставила открытой возможность того, что тип данных VARCHAR изменится в будущем выпуске, чтобы соответствовать стандарту SQL (именно поэтому каждый использует VARCHAR2 в Oracle, так как это поведение типов данных будет оставаться неизменным в будущем).

Ответ 9

Во-первых, вы знаете, что "пустой" и "нулевой" являются двумя ПОЛНОСТЬЮ РАЗЛИЧНЫМИ ВЕЩИМИ? Правильно?

Во-вторых: на большинстве языков программирования "означает" пустая строка ". Строка нулевой длины. В нем нет персонажей.

SQL не обязательно работает так. Если я определяю столбец "name char (5)", тогда "пустое" имя будет " " (5 пробелов).

Похоже, вам может понадобиться что-то вроде этого:

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

"Trim()" - одна из многих функций Oracle, которые вы можете использовать в PL/SQL. Это описано здесь:

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

'Надеюсь, что это поможет!