Oracle: поиск столбцов только с нулевыми значениями - PullRequest
9 голосов
/ 07 января 2011

У меня есть таблица с большим количеством столбцов и столбцом типа.

Некоторые столбцы кажутся всегда пустыми для определенного типа.

Я хочу создать представление для каждого типаи показывать только соответствующие столбцы для каждого типа.Работая в предположении, что если столбец имеет ТОЛЬКО нулевые значения для определенного типа, то эти столбцы не должны быть частью представления, как вы можете выяснить это с помощью запросов?

Существует ли SELECT [columnName]ИЗ [таблицы] ГДЕ [columnValues] ВСЕ [null]

Я знаю, что Я полностью выдумал все выше ... Я просто пытаюсь донести идею.Заранее спасибо!

Ответы [ 7 ]

10 голосов
/ 12 сентября 2012
SELECT  t.column_name
FROM    user_tab_columns t
WHERE   t.nullable = 'Y'
        AND t.table_name = 'YOUR_TABLE_NAME'
        AND t.num_distinct = 0
3 голосов
/ 21 января 2011
select
  count(col_1),
  count(col_2),
  count(col_3)
from
  <table>

возвращает количество записей в столбце с ненулевым значением (по крайней мере, в Oracle, т. Е.)

Например,

drop table tq84_count_nulls;

create table tq84_count_nulls (
  col_1  varchar(50),
  col_2  number,
  col_3  date
);

insert into tq84_count_nulls values (null, null, null);
insert into tq84_count_nulls values ('xx', null, null);
insert into tq84_count_nulls values (null,   42, null);
insert into tq84_count_nulls values ('yy',   12, null);

select
  count(col_1),
  count(col_2),
  count(col_3)
from
  tq84_count_nulls;

возвращает

COUNT(COL_1) COUNT(COL_2) COUNT(COL_3)
------------ ------------ ------------
           2            2            0

указывает на то, что col_3 состоит только из нулей.

Эта идея затем может быть использована для создания требуемого представления.

Для таблицы теперь требуется также * group_id *:

drop table tq84_count_nulls;
create table tq84_count_nulls (
  col_1    varchar(50),
  col_2    number,
  col_3    date,
  group_id varchar(2)
);

insert into tq84_count_nulls values (null, null, null, 'a');
insert into tq84_count_nulls values ('xx', null, null, 'a');
insert into tq84_count_nulls values (null,   42, null, 'a');
insert into tq84_count_nulls values ('yy',   12, null, 'a');

insert into tq84_count_nulls values (null, null, null, 'b');
insert into tq84_count_nulls values (null, null, null, 'b');
insert into tq84_count_nulls values (null,   42, null, 'b');
insert into tq84_count_nulls values (null,   12, null, 'b');




create or replace view nulls_per_type as 
with n as (
  select
    count(col_1) col_1_count,
    count(col_2) col_2_count,
    count(col_3) col_3_count,
    group_id
  from
    tq84_count_nulls
  group by 
    group_id
),
o as (
select case col_1_count when 0 then 'COL_1 is always 0 for ' || group_id else null end u from n union all
select case col_2_count when 0 then 'COL_2 is always 0 for ' || group_id else null end u from n union all
select case col_3_count when 0 then 'COL_3 is always 0 for ' || group_id else null end u from n
)
select * from o where u is not null;

Который при выборе возвращает:

select * from nulls_per_type;

COL_1 is always 0 for b
COL_3 is always 0 for a
COL_3 is always 0 for b
0 голосов
/ 09 июля 2018

Вы можете определить, используя следующий запрос:

выберите * из (выберите ascii (t.col2) + ascii (t.col4) + ascii (t.col1) + ascii (t.col3)col из test_null_col t) где col равно нулю;

И вы хотите удалить пустые строки столбца, вот запрос:

удалить из (выберите ascii (t.col2) + ascii (t.col4) + ascii (t.col1) + ascii (t.col3) col из test_null_col t), где col равно нулю;

0 голосов
/ 23 апреля 2014

SELECT tablecolumn, tablecolumn2, ... ИЗ TABLENAME ГДЕ столбец НЕ НУЛЬ

0 голосов
/ 24 января 2011

Я думаю, вы можете решить эту проблему с помощью метапрограммирования.Используйте курсор для циклического прохождения каждого типа и столбца и используйте «не существует», чтобы проверить, является ли столбец пустым.Например:

CREATE TABLE result_table (type VARCHAR(50), column VARCHAR(50))

CURSOR c IS
    SELECT COLUMN_NAME FROM ALL_TAB_COLS WHERE TABLE_NAME = &table_name;

CURSOR ct IS
    SELECT DISTINCT type_name FROM &table_name;

BEGIN

FOR t in ct
LOOP
    FOR r in c
    LOOP
        --If you're confused about how this works, replace 'EXECUTE IMMEDIATE'
        --with print or something and look at the output
        EXECUTE IMMEDIATE
            'INSERT INTO result_table SELECT ''' ||
                t.type_name || ''', ''' || r.COLUMN_NAME ||
                ''' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM ' || 
                &table_name || ' WHERE t.type_name = ''' || t.type_name ||
                ''' AND ' || r.COLUMN_NAME || ' IS NOT NULL);';
    END LOOP
END LOOP

SELECT * FROM result_table

Извинения, если где-то есть ошибка в синтаксисе, мне нечего проверять.

0 голосов
/ 21 января 2011

Просмотрев комментарии @Gerrat и @ BQ, я понял, что могу получить нужные мне данные следующим образом: у меня есть устаревшая таблица, которая имеет N различных типов. Все типы имеют общие столбцы и имеют эксклюзивные столбцы.

Я могу создать представление для каждого типа со всеми столбцами, а затем использовать all_tab_columns , чтобы получить имена всех столбцов, где «num_nulls» меньше общего числа строк для этого конкретного типа.

Оттуда должно быть легко собрать столбцы, которые используются для каждого типа, и создать представления.

Мысли

0 голосов
/ 07 января 2011

Что-то вроде этого?

SELECT column1, column2, column3 -- and so on
FROM tableA
WHERE columnX IS NULL
AND columnY IS NULL
AND columnZ IS NULL;

Очевидно, вы можете использовать это в выражении CREATE VIEW..., если вам нравится.

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