首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL在有时出现两个值时返回单个值。

SQL在有时出现两个值时返回单个值。
EN

Stack Overflow用户
提问于 2016-11-01 11:57:13
回答 3查看 627关注 0票数 1

非常熟悉SQL。

我的表包含访问要求,两种类型都保存在同一个表中。记录可以是'ADP'发送‘’或--两者都是。我需要返回一个值来输入另一个查询。

当两种访问类型都存在时,SELECT查询返回2行,那么如何编码它以返回单个值。因此,如果ADP只存在,我得到ADP,如果被发送,我只得到,而,如果ADP和SENT都被发现,我只能被发送。

我的表包含了许多字段,但本质上如下所示

代码语言:javascript
复制
SUA_PERUSER_ID  SUA_ACCESS_TYPE  
      10000000  ADP  
      10000001  SENT  
      10000002  ADP  
      10000002  SENT

我的疑问是

代码语言:javascript
复制
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>由用户输入。

EN

回答 3

Stack Overflow用户

发布于 2016-11-01 12:23:35

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

如果您不想使用按字母顺序排列的'SENT' > 'ADP'的意外,您可以这样做(代码更多,但出错的可能性更小):

代码语言:javascript
复制
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'只出现一次以上的话,一个更简单的版本;如果可能的话,一个更复杂的版本。下面我展示了更复杂的版本,它适用于更一般的情况。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-11-01 12:09:12

将您的字段称为"access_type“和表”access“,并对字段”所有者“的存在进行成像,您可以尝试使用这种脏的sql。

代码语言:javascript
复制
select max(access_type) , owner from access group by owner

它有点脏,并且使用了一个事实,即词汇发送是大于ADP的

编辑需要三个结果,它变化很大:

代码语言:javascript
复制
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

部分子查询将access_type转换为数字,外部查询解码结果之和。约束条件是,每个‘所有者’不应该超过2行。

对不起,如果有一些sql错误,因为我现在没有要测试的sql控制台

票数 1
EN

Stack Overflow用户

发布于 2016-11-01 12:01:39

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

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

如果发送的值为null,上述值将计算为已发送的值。否则,它将评估ADP的价值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40359575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档