2014-08-27 3 views
0

Я использую Oracle-SQL developerПараметрирование значений для oracle sql

Хотите проверить количество нулевых значений для каждого столбца.

В настоящее время я использую нижеследующее для достижения результатов.

не

выберите COLUMN_NAME из all_tab_columns где table_name = «EMPLOYEE»

SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name1> IS NULL 
    UNION ALL 
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name2> NULL 
    UNION ALL 
    SELECT COUNT (*) FROM EMPLOYEE WHERE <Column_name3> IS NULL 
    UNION ALL ...................... 

Как мы можем использовать привязки значение для запуска ниже запрос как

DEFINE Column_name = Column_name1 
    SELECT COUNT (*) FROM EMPLOYEE WHERE &&Column_name IS NULL . 
+0

Для этого вам необходимо перейти на динамический SQL-путь. – Sathya

+0

'NUM_NULLS' в' all_tab_columns' будет иметь количество значений NULL в этой таблице. Если таблица обновит статистику! Любые данные, вставленные/обновленные без сбора статистики, приведут к неправильному ответу. Чтобы узнать о статистике, вы можете сослаться на [Oracle Docs] (http://docs.oracle.com/cd/B10500_01/server.920/a96533/stats.htm) –

ответ

1

Вы не можете использовать переменные связывания при построении оператора select, вы можете передавать значения через переменные связывания, но сам вывод не может быть создан. Вы должны пойти the dynamic SQL way, using EXECUTE IMMEDIATE.

Вот пример:

DECLARE 
    v_sql_statement VARCHAR2(2000); 
    n_null_count NUMBER; 
BEGIN 
    FOR cn IN (SELECT column_name 
       FROM user_tab_cols 
       WHERE table_name = 'EMPLOYEE') LOOP 
     v_sql_statement := 'SELECT COUNT(1) FROM EMPLOYEE where ' 
          || cn.column_name 
          || ' IS null'; 

     EXECUTE IMMEDIATE v_sql_statement INTO n_null_count; 

     dbms_output.Put_line('Count of nulls for column: ' 
          || cn.column_name 
          || ' is: ' 
          || n_null_count); 
    END LOOP; 
END; 

Это то, что приведенный выше запрос будет получать

графа нулям для столбца: EMPNO является: 0
Количество нулей для столбца: NAME is: 0
Число совпадений для столбца: ЗАДАНИЕ: 0
Число совпадений для столбца: BOSS: 1
Количество нулей для столбца: HIREDATE является: 0
Количество нулей для колонки: ЗАРПЛАТА: от 0
Количество нулей для колонки: COMM составляет: 20
Количество нулей для столбца: DEPTNO является: 0

+0

Почему бы не один «EXECUTE IMMEDIATE» использовать all_tab_columns? 'COUNT (COLUMN_NAME1), COUNT (COLUMN_NAME2) FROM TABLE'? –

+0

@MaheswaranRavisankar COLUMN_NAME1, COLUMN_NAME2 ...COLUMN_NAMEn - это строки в all_tab_columns, вам нужно пройти через все строки и не найти нулей для каждого столбца_имя – Sathya

+0

Спасибо, Сатья за вас руководство – Awknewbie

0

Нет, вы не можете сделать это с помощью переменных связывания , Это связано с тем, что запрос выполняется и он должен знать имя поля во время компиляции. Чтобы достичь того, что вы хотите, вы можете построить запрос, который вам нужен, в VARCHAR2 и использовать немедленный запуск.

0

Почему бы просто не использовать NUM_NULLS? Но вы должны собрать статистику, прежде чем

exec dbms_stats.gather_table_stats('user','TBL'); 

select num_nulls from user_tab_columns where table_name='TBL'; 

Вы также можете использовать coalesce для более быстрого выполнения, чем IS NULL

SELECT COUNT(COALESCE(_COLUMN, 1)) AS CNT FROM _TABLE; 

Если вы хотите иметь столбец мудрый подсчет, то я бы второй ответ САТЬЯ, но с COALESCE вместо IS NULL

Смежные вопросы