2016-01-19 6 views
1

Я пытаюсь извлечь количество столбцов из all_tab_columns для конкретных столбцов перешли в положение в как:Как извлечь подсчитывать имена столбцов из таблицы на основе столбцов, переданных в пункт В

select count(COLUMN_NAME) 
    from ALL_TAB_COLUMNS 
WHERE owner='SA' and COLUMN_NAME IN ('CASE_REPORTER2SITE', 'PRIMARY2BUS_ORG') 
GROUP BY COLUMN_NAME 
HAVING COLUMN_NAME IN ('CASE_REPORTER2SITE', 'PRIMARY2BUS_ORG') 
ORDER BY DECODE (COLUMN_NAME, 'CASE_REPORTER2SITE', 1 'PRIMARY2BUS_ORG', 2) 

Вот когда оба существуют столбцы в база данных, она подсчитывает количество столбцов в 2 строках.

РЕЗУЛЬТАТ:

COUNT(COLUMN_NAME) 
------------------ 
2 
4 

Но, когда я прохожу один существующий и 1 не существующий столбец, как:

select count(COLUMN_NAME) 
    from ALL_TAB_COLUMNS 
WHERE owner='SA' and COLUMN_NAME IN ('CASE_XYZ', 'PRIMARY2BUS_ORG') 
GROUP BY COLUMN_NAME 
HAVING COLUMN_NAME IN ('CASE_XYZ', 'PRIMARY2BUS_ORG') 
ORDER BY DECODE (COLUMN_NAME, 'CASE_XYZ', 1 'PRIMARY2BUS_ORG', 2) 

(Предположим CASE_XYZ не существует). Это дает мне результат подсчета в 1 строке.

РЕЗУЛЬТАТ:

COUNT(COLUMN_NAME) 
------------------ 
4 

Ожидаемый результат:

COUNT(COLUMN_NAME) 
------------------ 
0 
4 

Как получить счетчик как 0 для определенного столбца, если она не существует?

ответ

1

Ммммы, единственный способ, которым я могу думать присоединяются таблица all_Tab_columns с себя созданным из двойных, левых внешнего соединения, чтобы те, кто являются недействительными, и поставить 0, если нуль, как это:

select t.column_name,case when count is null then 0 else count end from (
SELECT 'CASE_XYZ' as colname from dual 
union 
SELECT 'PRIMARY2BUS_ORG' from dual) t 
left outer join (
select column_name, count(COLUMN_NAME) as count from ALL_TAB_COLUMNS 
WHERE owner='SA' and COLUMN_NAME IN ('CASE_XYZ', 'PRIMARY2BUS_ORG') 
GROUP BY COLUMN_NAME HAVING COLUMN_NAME IN ('CASE_XYZ', 'PRIMARY2BUS_ORG') 
ORDER BY DECODE (COLUMN_NAME, 'CASE_XYZ', 1 'PRIMARY2BUS_ORG', 2)) s 
on t.colname = s.column_name 
3

Вы можете решить это, используя left join. С помощью интеллектуального подзапроса это устраняет in и decode() в order by.

Я бы фраза запрос как:

with cols as (
     select 'CASE_REPORTER2SITE' as col, 1 as ordering from dual union all 
     select 'PRIMARY2BUS_ORG', 2 as ordering from dual 
    ) 
select cols.col, count(atc.col_name) 
from cols left join 
    all_tab_columns atc 
    on cols.col = atc.col_name and atc.owner = 'SA' 
group by cols.col 
order by max(cols.ordering); 

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

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