Как выбрать столбцы из таблицы, которые имеют ненулевые значения? - PullRequest
21 голосов
/ 08 февраля 2010

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

Выбрать (ненулевые столбцы) из имени таблицы;

Я хочу выбрать все столбцы, которые имеют хотя бы одно ненулевое значение.

Можно ли это сделать?

Ответы [ 6 ]

4 голосов
/ 07 марта 2016

Используйте ниже:

SELECT *
FROM information_schema.columns
WHERE table_name = 'Table_Name' and is_nullable = 'NO'

Table_Name необходимо заменить соответственно ...

4 голосов
/ 18 сентября 2012
select column_name
from user_tab_columns
where table_name='Table_name' and num_nulls=0;

Вот простой код для получения ненулевых столбцов.

3 голосов
/ 09 февраля 2010

Посмотрите статистическую информацию, она может быть вам полезна:

SQL> exec dbms_stats.gather_table_stats('SCOTT','EMP');

PL/SQL procedure successfully completed.

SQL> select num_rows from all_tables where owner='SCOTT' and table_name='EMP';

  NUM_ROWS
----------
        14

SQL> select column_name,nullable,num_distinct,num_nulls from all_tab_columns
  2  where owner='SCOTT' and table_name='EMP' order by column_id;

COLUMN_NAME                    N NUM_DISTINCT  NUM_NULLS
------------------------------ - ------------ ----------
EMPNO                          N           14          0
ENAME                          Y           14          0
JOB                            Y            5          0
MGR                            Y            6          1
HIREDATE                       Y           13          0
SAL                            Y           12          0
COMM                           Y            4         10
DEPTNO                         Y            3          0

8 rows selected.

Например, вы можете проверить, если NUM_NULLS = NUM_ROWS, чтобы идентифицировать «пустые» столбцы.
Ссылка: ALL_TAB_COLUMNS , ALL_TABLES .

3 голосов
/ 08 февраля 2010

Не думаю, что это можно сделать одним запросом. Вам может понадобиться некоторый plsql, чтобы сначала проверить, какие столбцы содержат данные, и составить оператор, основанный на этой информации. Конечно, если данные в вашей таблице изменяются, вы должны заново создать оператор.

declare

   l_table          varchar2(30) := 'YOUR_TABLE';
   l_statement      varchar2(32767);
   l_test_statement varchar2(32767);

   l_contains_value pls_integer;

   -- select column_names from your table
   cursor c is
      select column_name
            ,nullable
        from user_tab_columns
       where table_name = l_table;

begin
   l_statement := 'select ';
   for r in c
   loop
      -- If column is not nullable it will always contain a value
      if r.nullable = 'N'
      then
         -- add column to select list.
         l_statement := l_statement || r.column_name || ',';
      else
         -- check if there is a row that has a value for this column
         begin
            l_test_statement := 'select 1 from dual where exists (select 1 from ' || l_table || ' where ' ||
                                r.column_name || ' is not null)';
            dbms_output.put_line(l_test_statement);
            execute immediate l_test_statement
               into l_contains_value;


            -- Yes, add column to select list
            l_statement := l_statement || r.column_name || ',';
         exception
            when no_data_found then
               null;
         end;

      end if;
   end loop;

   -- create a select statement
   l_statement := substr(l_statement, 1, length(l_statement) - 1) || ' from ' || l_table;

end;
0 голосов
/ 15 декабря 2014
select rtrim (xmlagg (xmlelement (e, column_name || ',')).extract ('//text()'), ',') col
from (select column_name
from user_tab_columns
where table_name='<table_name>' and low_value is not null)
0 голосов
/ 08 февраля 2010

То, что вы просите сделать, - это установить зависимость для каждой строки во всем результате. Это на самом деле , а не , что вы хотите. Подумайте только о последствиях, если в одной строке каждый столбец имел значение «0» - внезапно схема вашего результирующего набора увеличивается, чтобы включить все эти ранее «пустые» столбцы. Вы эффективно увеличиваете значение '*' в геометрической прогрессии, теперь ваш набор результатов не зависит только от метаданных таблицы - но весь ваш набор результатов зависит от простых данных.

То, что вы хотите сделать, это просто выбрать поля, которые имеют то, что вы хотите, и не отклоняться от этого простого плана.

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