【问题标题】:Oracle - View, display in one column value from different columnsOracle - 查看,在一列中显示来自不同列的值
【发布时间】:2016-03-29 04:18:25
【问题描述】:

我正在尝试从一个表中创建某些字段的视图。由于限制,视图必须采用这种格式。

我们将表命名为 Employee。如果类别字段中的值 = A,我需要视图来显示字段 Info1。如果类别字段中的值 = B,则需要 Info2 值。

Create View Emp as Select name, category, info from 
  (select name, category, info1 from employee where category='A') 
UNION 
  (select name, category, info2 from employee where category <>'A')

我的理解是这可以通过联合来完成,但是我的视图有很多字段,并且联合的查询会很长。有没有其他方法可以达到同样的效果?或许通过DECODE方法?

Name   ID   Category    Info1    Info2 </h1>
Max    11   A           VIP      Present 
---
Sandra 22   A           VIP      XXX 
---
Lou    33   B           Regular  XXX 
---
Pat    44   B           VIP      XXX 
---

【问题讨论】:

    标签: sql oracle view


    【解决方案1】:

    你可能需要一个案例陈述

     Create View Emp as
       Select name, category, 
              CASE WHEN category='A' THEN info1 ELSE info2 END as INFO 
       from employee
    

    或者你可能想要加入

     Create View Emp as
       Select a.name, a.category, b.info1, c.info2
       from employee a
       join employee b on (a.name, a.category) = (b.name, b.category) and b.category = 'A'
       join employee c on (a.name, a.category) = (c.name, c.category) and c.category <> 'A'
    

    或者你可以坚持联合 - 但如果你这样做,我建议联合所有 - 它会更快。

    无论如何,您真正想要的取决于您没有告诉我们的所有要求。

    不要害怕有一个长查询——一个查询有多少行确实没有什么问题——它可能有 100 行长并且产生更快的输出然后一个较小的查询做同样的事情。

    【讨论】:

    • 感谢您的建议。我没有想过使用 CASE 选项。我绝对喜欢它而不是工会。我的要求很简单,只是根据类别值显示不同的列。我将比较 UNION ALL 和 CASE 选项之间的性能,如果联合产生更快的结果,我将使用 UNION ALL。感谢您的帮助。
    【解决方案2】:
    Create View Emp
    as
      Select name,
             category,
             CASE category WHEN 'A' THEN info1 ELSE info2 END AS info
      from   employee 
    

    【讨论】:

      猜你喜欢
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多