首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据传入IN子句的列从表中获取列名计数

如何根据传入IN子句的列从表中获取列名计数
EN

Stack Overflow用户
提问于 2016-01-19 13:31:08
回答 2查看 129关注 0票数 1

我试图从all_tab_columns中获取传入IN子句的特定列的列计数,例如:

代码语言:javascript
运行
复制
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行中的计数。

结果:

代码语言:javascript
运行
复制
COUNT(COLUMN_NAME)
------------------
2
4

但是,当我传递一个现有列和一个不存在列时,如下所示:

代码语言:javascript
运行
复制
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不存在)。它给了我一排的计数结果。

结果:

代码语言:javascript
运行
复制
COUNT(COLUMN_NAME)
------------------
4

预期结果:

代码语言:javascript
运行
复制
COUNT(COLUMN_NAME)
------------------
0
4

如果特定列不存在,如何将其计数为0?

EN

回答 2

Stack Overflow用户

发布于 2016-01-19 13:56:49

您可以使用left join解决这个问题。使用智能子查询,这也消除了inorder by中的decode()

我想把这个问题说成:

代码语言:javascript
运行
复制
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);

注意:我还在输出中包含了列名,因为我认为这是一个很好的实践。

票数 3
EN

Stack Overflow用户

发布于 2016-01-19 13:46:51

Mmmm,我能想到的唯一方法是使用从双、左外部联接创建的self来连接all_Tab_columns表,以保留空值,并在空时放置0,如下所示:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34878136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档