2017-01-23 17 views
0

私はいくつかのクエリ結果をcoalesce関数で取得しようとしていますが、複数の値が与えられたときに、oracleエラーが発生します。関数coalesceで複数の値を取得する方法

Without Node 123winadm availabe 
Node2 unsolwa33 availabe 
Node1 unsolwa33 availabe 
Node4 unsolwa33 availabe 

エラーは次のとおりです:

SELECT COALESCE((select GRPNAME from CMS_NODGRP where upper(NODEID)=UPPER('unsolwa33')), 'Without_Node') || ' 134unixadmin' || ' available' FROM DUAL; 

誰かが私は私に(このような)出力の欲望を与えるために助けることができる:これらは私のクエリです

ORA-01427: single-row subquery returns more than one row 

テーブルは次のようになります。

GRPNAME  NODEID 
------------------------ 

GroupA  NodeA 
GroupB  NodeA 
GroupB  NodeB 
GroupC  NodeC 

私は質問をしてくれます:

NodeD,WithoutNodeID 
NodeA, GroupA 
NodeA, GroupB 
NodeB, GroupB 
NodeC, GroupC 

多くのありがとう!

+1

あなたの質問を編集してくださいサンプルデータと望ましい結果を提供します。 –

+0

ORACLEエラーは何ですか? –

+0

私はエラーで質問を編集します。希望の結果はメインポスト – absolute333

答えて

0

問題はCOALESCE()ではありません。サブクエリです。

これは、あなたが何をしたいことがありますあなたが代わりに行うことができ

select COALESCE(GRPNAME, 'Without_Node' || ' 134unixadmin') || ' available' 
from CMS_NODGRP 
where upper(NODEID) = UPPER('unsolwa33'); 
+0

を編集しましたが、うまくいかないようです。検索結果がない場合、「no rows selected」と表示されます。Without_Node unsolwa33 available – absolute333

0

select coalesce(cng.grpname, dummy.col1) || ' 134unixadmin' || ' available' node_availability 
from (select 'Without Node' col1 from dual) dummy 
     left outer join (select grpname 
         from cms_nodgrp 
         where upper(nodeid) = upper('unsolwa33')) cng on (1=1); 

これは一種のクロスのような働きに参加、しかしから返される行がないことをイベントでcngサブクエリでは、ダミーサブクエリからの行が常に返されます。そうすれば、合体を使って何を出力するかを決めることができます。

N.B.これは、cng副問い合わせによって返される行数だけ返します。実際には1つの行だけが返されるようにするには、常にand rownum = 1を追加するか、すべての行が同じgrpnameを持つことがわかっている場合は、選択リストにDISTINCTを使用できます。


そして、上記のクエリは実際に仕事をしていることの証明:存在しないノードidの場合

:使用可能なノードidのために

WITH cms_nodgrp AS (SELECT 'unsolwa33' nodeid, 'abc' grpname FROM dual UNION ALL 
        SELECT 'unsolwa33' nodeid, 'def' grpname FROM dual UNION ALL 
        SELECT 'unsolwa44' nodeid, 'egh' grpname FROM dual) 
-- end of mimicking some data in your table. See SQL below: 
select coalesce(cng.grpname, dummy.col1) || ' 134unixadmin' || ' available' node_availability 
from (select 'Without Node' col1 from dual) dummy 
     left outer join (select grpname 
         from cms_nodgrp 
         where upper(nodeid) = upper('not exists')) cng on (1=1); 

NODE_AVAILABILITY 
----------------------------------- 
Without Node 134unixadmin available 

WITH cms_nodgrp AS (SELECT 'unsolwa33' nodeid, 'abc' grpname FROM dual UNION ALL 
        SELECT 'unsolwa33' nodeid, 'def' grpname FROM dual UNION ALL 
        SELECT 'unsolwa44' nodeid, 'egh' grpname FROM dual) 
-- end of mimicking some data in your table. See SQL below: 
select coalesce(cng.grpname, dummy.col1) || ' 134unixadmin' || ' available' node_availability 
from (select 'Without Node' col1 from dual) dummy 
     left outer join (select grpname 
         from cms_nodgrp 
         where upper(nodeid) = upper('unsolwa33')) cng on (1=1); 

NODE_AVAILABILITY 
----------------------------------- 
abc 134unixadmin available 
def 134unixadmin available 
+0

not works:select coalesce(cng.grpname、dummy.col1)|| '134unixadmin' || 'available' node_availability 2 from(ノードなしのcol1をデュアルから選択)ダミーの左外部結合(選択grpname 3 cms_nodgrpから上(nodeid)=上位( '存在しません))cng on(1 = 1); 行が選択されていません – absolute333

+0

@ absolute333なぜ結果が得られないのかわかりません。それは私のために働く - 私は私が得た結果のデモを含めるために私の答えを更新しました。クエリが左外部結合を使用しているということは、少なくとも1行を取得することを意味します(ダミーのcol1が入力され、cng.grpnameがnullの場合)。 – Boneist

+0

ありがとう、私のためには動作しません:SQL> Select cms_nodgrp where upper(nodeid)= upper( 'unsolwa33'); 行が選択されていない – absolute333

関連する問題