Sql 如何在Oracle中有条件地选择列?

Sql 如何在Oracle中有条件地选择列?,sql,oracle,Sql,Oracle,我想从Oracle中选择一个数据。但是,我有一个列-CHILD\u IDN,它决定了哪个列适合我。如果列具有idn,则我需要从表中选择子项,否则默认情况下,我应该选择父项。MSSQL允许一个简单的CASE语句工作。 但是甲骨文呢?是否存在与Oracle vs MSSQL兼容的查询?我认为这是一个非标准化的数据,因此需要建议 比如说 TableA 1 PARENT CHILD_IDN CHILD 2 Okay 3 Cool 1 PickMe1 4

我想从Oracle中选择一个数据。但是,我有一个列-
CHILD\u IDN
,它决定了哪个列适合我。如果列具有idn,则我需要从表中选择
子项
,否则默认情况下,我应该选择
父项
。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

您可以使用
案例执行此操作

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)

您也可以在Oracle中使用
CASE
语句。像

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

使用
CASE
DECODE
语句,如下所示:

测试数据

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

以上带有测试数据的查询提供了问题中提出的预期结果

你能用coalesce忽略childidn吗选择coalease(子级,父级),因为“coalesce”将获取序列中的第一个非空值。如果存在所有子对象(如果不存在父对象),则似乎要将其拉入。Coalese做得相当好。我想看看coalease,但我需要检查第一个非空值?需要进行检查。我在命令行2中得到了从第2行开始的错误:当end_dt不为NULL时选择CASE,然后在命令行中选择end_dt ELSE start_dt从测试错误开始:2列:61错误报告:SQL错误:ORA-00905:缺少关键字00905。00000-“缺少关键字”@Nishant,请查找修改后的答案<代码>选择end_dt不为空时的情况,然后选择end_dt ELSE从测试开始\u dt end@Nishant,你漏掉了“END”关键字。谢谢,我只是注意到:本质上是类似的。是的,但这太难了:)但是另一种思考方式。@Nishant:查询几乎只有两三行。我已经在with子句中包含了测试数据,这样您就可以运行查询并检查输出。是否希望我在没有测试数据的情况下单独放置查询?抱歉,我没有注意到-我是DB的新手。这很有趣,我已经编辑了答案。我将检查解码选项-是否与Oracle MSSQL兼容?是否与Oracle 100%兼容。