当有两个有时存在时,SQL返回单个值

时间:2016-11-01 11:57:14

标签: sql oracle

非常适合SQL的初学者

我的表包含访问要求,两种类型都保存在同一个表中。 记录可以包含' ADP' ' SENT' 两者。 我需要返回一个值来提供给另一个查询。

当两种访问类型都存在时,我的SELECT查询返回2行,因此如何对其进行编码以返回单个值。 所以,如果只有ADP存在,我会得到ADP, 如果只找到SENT,我会得到SENT 如果发现ADP和SENT,我只会获得SENT。

我的表包含许多字段,但实质上看起来像这样

SUA_PERUSER_ID  SUA_ACCESS_TYPE  
      10000000  ADP  
      10000001  SENT  
      10000002  ADP  
      10000002  SENT

我的查询是

SELECT S_USER_ACCESS.SUA_PERUSER_ID, S_USER_ACCESS.SUA_ACCESS_TYPE  
FROM   S_USER_ACCESS  
WHERE  S_USER_ACCESS.SUA_PERUSER_ID = <Client_ID>  

用户输入<client_ID>

3 个答案:

答案 0 :(得分:2)

将您的字段称为&#34; access_type&#34;和你的桌子&#34;访问&#34;并成像一个领域的存在&#34;所有者&#34;你可以试试这个脏sql

select decode (sum(partial.cnt),1,'ADP',2,'SENT',3,'BOTH') access_type, patial.owner from (
select decode(access_type,'ADP', 1,'SENT',2,0) cnt, access_type, owner from     access ) partial
group by partial.owner

它有点脏,并且使用词汇SENT为&gt;的事实。比ADP

修改 需要3个结果后,它会发生很大的变化:

reraise

部分子查询将access_type转换为数字,外部查询解码结果总和。 限制条件是每个所有者不应超过2行。

很抱歉,如果有一些sql错误,因为我现在没有sql控制台进行测试

答案 1 :(得分:2)

正如Massimo所说,你需要group by sua_peruser_id才能得到一个值。或者,如果您只需要一个sua_peruser_id执行此操作,您将拥有where子句(并且不需要group by)。

如果您不想使用词典'SENT' > 'ADP'的意外,您可以执行以下操作(更多代码,但错误的可能性更小):

select sua_peruser_id, 
       max(sua_access_type) keep (dense_rank first order by
                                          case sua_access_type when 'SENT' then 1
                                                               when 'ADP'  then 2
                                          end) as sua_access_type
from s_user_access
group by sua_peruser_id

如果您有两个以上可能的值SENTADP,则更好的解决方案是将这些可能的值放在一个单独的表中,并将其优先顺序放在第二列中...但也许这对你的具体用例来说太过分了。

编辑 - 仍在等待OP澄清修改后的要求。如果同时存在'SENT''ADP',则结果应显示为'BOTH'而不是'SENT'。最好使用汇总函数min()max()来完成此操作。有两个版本 - 如果'SENT''ADP'保证每个sua_peruser_id出现不超过一次,则更简单;如果可能重复,则更复杂一个版本。下面我展示了更复杂的版本,它适用于更一般的情况。

select sua_peruser_id, 
       case when min(sua_access_type) != max(sua_access_type) then 'BOTH'
            else min(sua_access_type) 
       end  as sua_access_type
from   s_user_access
where  sua_peruser_id = <customer_id>  -- (provided by user)

答案 2 :(得分:-1)

如果ADP和SENT是同一个表中的两列,其中一列可能为null,请使用NVL()函数:

SELECT NVL(SENT, ADP) FROM ....

如果SENT不为空,上面将评估SENT的值。否则,它将评估ADP的值。