Пустые или пустые поля (ORACLE) - PullRequest
30 голосов
/ 06 февраля 2012

Я новичок в 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

и т. Д.

Но в этом столбце есть сотни или тысячи пустых полей / пустых полей. Может ли кто-нибудь помочь мне найти количество этих пустых / пустых полей в этом столбце? Я использую жабу для Oracle 9.0.1.8

Ответы [ 9 ]

45 голосов
/ 06 февраля 2012

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

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL

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

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

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

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

9 голосов
/ 06 февраля 2012

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

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

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

2 голосов
/ 06 ноября 2014

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

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

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

Работает как шарм

2 голосов
/ 06 февраля 2012

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

SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL
1 голос
/ 16 июня 2013
SELECT COUNT (COL_NAME) 
FROM TABLE 
WHERE TRIM (COL_NAME) IS NULL 
or COL_NAME='NULL'
0 голосов
/ 06 июля 2017

НИКОГДА не следует обращаться с «ПУСТОЙ», и НУЛЬ имеет то же самое.

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

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

0 голосов
/ 06 ноября 2014
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.

0 голосов
/ 06 февраля 2012

Во-первых, вы знаете, что "blank" и "null" - это две ПОЛНОСТЬЮ РАЗНЫЕ ВЕЩИ ?Правильно?

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

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

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

0 голосов
/ 06 февраля 2012

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

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

попробовать

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...