2017-07-07 4 views
-2

表1と表からのカウントを取得するには助けが必要表1、「ロック」の値の最初の行では、CLOB列

a with datatype Number 
b with datatype clob 

表1

のデータ
a  |  b 
100  | Rock+Y;Paper+No;Scissor+Yes;Dragon+Y;<br> 
101  | Rock+N;Paper+No;Scissor+Yes;Dragon+N;<br> 
102  | Rock+Y;Paper+Yes;Scissor+N;Dragon+Y; 


を次のように2列がありますYは、Paperの値はNo、 'Scissor'の値はYes、bの 'Dragon'の値はYです。
私は、ロック、ペーパー、シザーだけを、カウントbの列にY、Yes、Yesの値でそれぞれ考えたいと思います。
私は、列cの値に基づいて列aの数を求めます。
例:= 100について

、ロックの値はYとシザーの値と同様の値を持つ属性のみ(ロック= Y、紙=はい、シザー+はい)
すなわち2カウントはいあります。

同様に、aiss = 101の場合、Shissorだけが希望値を持つため、つまりRockは 'N'、Paperは 'No'です。

a = 102、count = 2の場合、RockとPaperにはそれぞれYとYesの値があります。

この結果はどのように達成できますか?

+0

私は答えを書くことを約ありましたこれは 'REGEXP_COUNT'を使用していますが、私はあなたの説明をより慎重に読んで、矛盾を見ました。まず、a = 100の場合、「はい」のものではなく「Y」だけを数え、次にa = 101の場合は2を数えます。これは正当化できないので、a = 102の場合は3になります。私はここにパターンを見ないか、少なくとも今のところは見えない。 「Y」を数えるか、「はい」とカウントし、必ずしもそうでない場合は、これらのケースを指定する必要があります。 – g00dy

+0

@ mac07 - あなたの問題のために何の質問が書こうとしましたか?たぶん、私たちはあなたの質問を修正することであなたを助けることができます。 –

+0

@ g00dy a = 101の場合、値がYの場合はRockを、値がYesの場合はPaperを、値がYesの場合はScissorをカウントする必要があります。 RockがY、PaperがYes、ScissorがYesの場合、カウントは3になります。今は明らかですか? – mac07

答えて

0

データを個々の「属性」に分けると、答えは単純なSQLで行うことができます。 SUBSTR関数はここで使用されていますが、同等のCLOB関数でも動作する必要があります。

タブはサンプルデータ tab_attributesを持っているサンプルデータが tab_nbrが1にYを変換し、属性に分離しており、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 
;