2017-05-24 72 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,這可能不是一個好主意。 –