【问题标题】:How to select columns conditionally in Oracle?如何在 Oracle 中有条件地选择列?
【发布时间】:2014-06-08 00:18:26
【问题描述】:

我想从 Oracle 中选择一个数据。但是我有一个专栏 - CHILD_IDN - 决定哪一专栏适合我。如果该列有一个 idn,那么我需要从表中选择 CHILD ,否则默认情况下我应该选择 PARENT 。 MSSQL 允许一个简单的 CASE 语句工作。 但是甲骨文呢?是否有针对此的 Oracle vs MSSQL 兼容查询?我认为它是非标准化数据,因此需要建议。

例如

TableA

1    PARENT  CHILD_IDN CHILD
2    Okay 
3    Cool    1         PickMe1 
4    Fine
5    Test
6    Bar     2         Pickme2
7    Hello   


Now the result expected is 

Okay 
PickMe1
Fine
Test
Pickme2
Hellow

【问题讨论】:

  • 你可以只使用coalesce 并忽略childidn 吗? ` select coalease(child, parent) as Result` coalesce 采用系列中的第一个非空值。看来您想拉入所有子项(如果存在),如果不是父项。 Coalese 在这方面做得很好。
  • 对,看看 coleaease ,但我需要检查第一个非空值?需要检查一下。

标签: sql oracle


【解决方案1】:

您也可以在 Oracle 中使用 CASE 语句。喜欢,

SELECT CASE WHEN child_idn IS NOT NULL THEN child 
       ELSE parent 
       END
FROM   tableA;

【讨论】:

  • 我在命令的第 2 行开始出现错误:SELECT CASE WHEN end_dt IS NOT NULL THEN end_dt ELSE start_dt FROM Test Error at Command Line:2 Column:61 错误报告:SQL 错误:ORA-00905:缺少关键字 00905. 00000 - “缺少关键字”
  • @Nishant,请找到修改后的答案。 SELECT CASE WHEN end_dt IS NOT NULL THEN end_dt ELSE start_dt END FROM Test;
  • @Nishant,您错过了“END”关键字。
【解决方案2】:

您可以使用case

select (case when child_idn = 2 then child else parent
        end)
from table t;

这是标准 SQL,应该适用于任一数据库。

注意:这假定“空白”值为NULL,并使用条件将在NULL 值上失败的事实。如果你愿意,你也可以是明确的:

select (case when child_idn = 1 then parent
             when child_idn = 2 then child
             else parent
        end)

【讨论】:

【解决方案3】:

如下使用CASEDECODE 语句:

测试数据

WITH TABLEA AS
(
SELECT 1 SLNO, 'OKAY' PARENT, '' CHILD_ID, '' CHILD FROM DUAL
UNION 
SELECT 2 SLNO, 'COOL' PARENT, '1' CHILD_ID, 'PICKME1' CHILD FROM DUAL
UNION 
SELECT 3 SLNO, 'FINE' PARENT, '' CHILD_ID, '' CHILD FROM DUAL
UNION 
SELECT 4 SLNO, 'TEST' PARENT, '' CHILD_ID, '' CHILD FROM DUAL
UNION 
SELECT 6 SLNO, 'BAR' PARENT, '2' CHILD_ID, 'PICKME2' CHILD FROM DUAL
UNION 
SELECT 7 SLNO, 'HELLO' PARENT, '' CHILD_ID, '' CHILD FROM DUAL
)

备选方案 1: 带解码

SELECT DECODE(CHILD_ID,'',PARENT,CHILD) CHILD
FROM TABLEA

备选方案 2:带案例

SELECT (CASE WHEN CHILD_ID IS NOT NULL THEN child 
       ELSE parent 
       END) value
FROM TABLEA

上述带有测试数据的查询提供了问题中所要求的预期结果!

【讨论】:

  • 是的,但是这太硬编码了 :) 但是是另一种思考方式。
  • @Nishant:查询几乎只有 2 或 3 行。我也将测试数据包含在 with 子句中,这样您就可以运行查询并检查输出。
  • 你要我把查询分开放,没有测试数据吗?
  • 抱歉,我没有注意到 - 我是 DB 新手。那很有趣,我已经编辑了答案。我将检查解码选项 - 它与 Oracle MSSQL 兼容吗?
  • 它是 100% oracle 兼容的。
猜你喜欢
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2019-04-20
  • 1970-01-01
  • 2023-03-10
  • 2019-03-29
  • 2020-12-02
相关资源
最近更新 更多