需要帮助从clob列的表中获取计数

时间:2017-07-07 13:23:10

标签: sql oracle

表1有2列如下

collect

表1中的数据

a with datatype Number
b with datatype clob

在表1的第一行中,'Rock'的值为Y,'Paper'的值为No,'Scissor'的值为Yes,'Dragon'的值为b列中的Y. br />我想只考虑Rock,Paper和Scissor,在b列中分别为Y,Yes和Yes计数。
我希望根据列c的值对列a进行计数。
实施例:

对于a = 100,仅计算具有值的属性(Rock = Y,Paper = Yes,Scissor + Yes),即2,因为Rock的值为Y且Scissor的值为Yes。
同样地,对于a = 101,count = 1,因为只有剪刀具有期望值,即'是',而Rock具有'N'而Paper具有'否'。

对于a = 102,count = 2 Rock and Paper分别具有所需的值,即Y和Yes。

如何实现这一结果?

1 个答案:

答案 0 :(得分:0)

如果将数据分成单独的“属性”,则可以使用简单的SQL完成答案。这里使用SUBSTR函数,但也应该使用等效的CLOB函数。

标签包含示例数据 tab_attributes将样本数据分离为属性 tab_nbr将Y转换为1,将N转换为0 最终选择只是添加它们:

with tab as
(select 100 a, 'Rock+Y;Paper+No;Scissor+Yes;Dragon+Y;' b from dual union
select 101 a, 'Rock+N;Paper+No;Scissor+Yes;Dragon+N;' b from dual union
select 102 a, 'Rock+Y;Paper+Yes;Scissor+N;Dragon+Y;' b from dual 
)
, tab_attributes as
(
select a
, substr(b, instr(b, 'Rock+')+5,1) rock
, substr(b, instr(b, 'Paper+')+6,1) paper
, substr(b, instr(b, 'Scissor+')+8,1) scissor
from tab
)
, tab_nbr as
(select a
, case when rock = 'Y' then 1 when rock = 'N' then 0 else null end as rock 
, case when paper = 'Y' then 1 when paper = 'N' then 0 else null end as paper 
, case when scissor = 'Y' then 1 when scissor = 'N' then 0 else null end as scissor
from tab_attributes
)
select a, rock+paper+scissor cnt from tab_nbr
;