我有一个视图myview
,它以下列方式检索信息:
ID | ATTRNAME | ATTRVAL
1 | attr1 | a
2 | attr2 | b
3 | attr3 | c
4 | attr3 | d
.. | .. | ..
.. | .. | ..
我需要输出如下:
ATTRNAME | ATTRVAL
attr1 | a
attr2 | b
attr3 | Multiple Values
其中,如果属性(ATTRNAME)有单个值,则应显示该属性,如果属性有多个值(例如attr3),则应显示文本“Multiple Values”。
我试过了:
SELECT DISTINCT attrname
, CASE cnt
WHEN 1 THEN TO_CHAR(attrval)
ELSE 'Multiple Values'
END AS attrval_rev
FROM myview
JOIN (SELECT attrname, COUNT(attrval) AS cnt
FROM myview
GROUP BY attrname) USING (attrname)
这是有效的,但这不是正确的解决方案,因为它需要花费8分钟来执行大约11,000行。请帮忙!
答案 0 :(得分:3)
有一种更简单的方法:
SELECT ATTRNAME,
CASE WHEN COUNT(*) = 1 THEN MIN(attrval) ELSE 'Multiple Values' END
FROM myview
GROUP BY ATTRNAME
如果您仍然遇到性能问题,请与我们联系。
答案 1 :(得分:2)
试试这个:
select attrname,
(case when min(attrval) = max(attrval) then min(attrval)
when min(attrval) is null then null
else 'Multiple Values'
end)
from myview
group by attrname
请注意,这会将NULL
忽略为有效值。
您也可以将第一个列表设为when count(distinct attrval) = 1
,但count(distinct)
比min()
和max()
贵一点。
答案 2 :(得分:0)
选择attrname,WHEN count(*)> 1然后'多个值'ELSE TO_CHAR(attrval)END 来自myview GROUP BY attrname