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

Как выбрать столбцы из таблицы с ненулевыми значениями?

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

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

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

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

4b9b3361

Ответ 1

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

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.

Ответ 2

select column_name
from user_tab_columns
where table_name='Table_name' and num_nulls=0;

Вот простой код, чтобы получить непустые столбцы.

Ответ 3

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

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

Table_Name должен быть соответствующим образом заменен...

Ответ 4

Я не думаю, что это можно сделать в одном запросе. Возможно, вам понадобится какой-то 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;

Ответ 5

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)

Ответ 6

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

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