非常适合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>
。
答案 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
如果您有两个以上可能的值SENT
和ADP
,则更好的解决方案是将这些可能的值放在一个单独的表中,并将其优先顺序放在第二列中...但也许这对你的具体用例来说太过分了。
编辑 - 仍在等待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的值。