2017-05-24 74 views
-2

加盟值的列表我有一个字符串,如甲骨文:如何权SQL

字符串ID =“1,2,3,4”;

在Oracle数据库中, 现在我可以做选择的

select a.name from a where id in (ids); 

的结果是,如果在一个表中存在1,2,4,然后将在列表中显示。如果4不在表中,则不会显示。

我想做一个右连接如

select a.name from a right join on a.id in (ids); 

我希望的结果可能是

1's name 
2's name 
3's name 
null 
+0

请张贴一些示例数据和预期的结果。你确定你需要加入吗? – Aleksej

回答

0

您可能需要执行以下操作:

select d.id, case when IDs.id is not null then name end asname 
from yourData d 
    left join 
    (
     select trim(regexp_substr('1,2,3', '[^,]+', 1, level)) as id 
     from dual 
     CONNECT BY instr('1,2,3', ',', 1, level - 1) > 0 
    ) IDs 
    on d.id = IDs.id 

这给:

 ID NAME 
---------- ------ 
     1 Name 1 
     2 Name 2 
     3 Name 3 
     4 
+0

谢谢。但是,如果4的名称为空,则数据不会出来。 –

+0

这个问题并不清楚。我刚刚编辑给你看一个方法 – Aleksej

+0

非常感谢。我改变了正确的加入,那么现在就可以。 –

0

不要使用right joinleft join更直观(保留第一个表中的所有行加上第二个中的匹配行)。在Oracle中,您可以这样做:

select i.id, a.name 
from (select 1 as id from dual union all 
     select 2 as id from dual union all 
     select 3 as id from dual union all 
     select 4 as id from dual 
    ) i left join 
    a 
    on i.id = a.id; 

还有其他方法可以生成标识列表。如果您正在学习Oracle,此方法相对简单。

+0

谢谢你的回答。但是什么是双重? –

+0

哦,我明白了。你的方式是成功的。非常感谢你。 –

+0

但有一个问题,如果有太多的ID,如1,2,3,4,5 ..... 1000。 SQL将会太长。对于长字符串ID,这可能不是一个好主意。 –