如何通过函数coalesce获得多个值

时间:2017-01-23 12:51:33

标签: sql oracle

我试图通过coalesce函数获取一些查询结果但是当它给我多个值时它会产生oracle错误。这些是我的疑问:

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

有人可以帮我提供输出欲望(如下):

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

错误是:

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

非常感谢!

2 个答案:

答案 0 :(得分:0)

您的问题不是public override completeAttributeRef_AttributeRef(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) { val classID = (model as AttributeRef).cosem.classid val CosemClasseManager = new CosemClasses() var proposal = CosemClasseManager.getAttributeString(classID) for (String s : proposal) { acceptor.accept(createCompletionProposal(s, s, null , context))} } ,而是子查询。

这可能是你想要的:

COALESCE()

答案 1 :(得分: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子查询返回的行,则将始终返回虚拟子查询中的行。这样,您就可以使用coalesce来决定输出什么。

N.B。这将返回cng子查询返回的行数。如果您确实只想返回一行,则可以随时添加and rownum = 1,或者如果您知道所有行都具有相同的grpname,则可以在选择列表中使用DISTINCT

并证明上述查询确实有效:

对于不存在的nodeid:

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

对于可用的nodeid:

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
相关问题