1
I have the following query:

Select 
Count(Distinct Case When Play.Uuid Like ('i~%') Then Tap.Player_Id End) As Tapjoy_Ios
From
Player_Tapjoy Tap
Inner Join 
Player Play 
On 
Tap.Player_Id = Play.Player_Id
Where 
Trunc(Tap.Create_Dtime) >= To_Date('2012-Jan-01','yyyy-mon-dd')

play.uuidのような('i〜%'または'ti〜%')..のような結果が得られるように、constraintのようなものをもう1つ追加したいのですが、それは機能しないようです。どうすればこれを実装できますか?

4

3 に答える 3

1

LIKE論理で接続された2つの完全な句が必要ですOR。それぞれの句には、キーワードの左側と右側の両方がありLIKEます(左側の列、右側の文字列値)。

count(Distinct Case When (Play.Uuid Like 'i~%') OR (Play.Uuid LIKE 'ti~%') Then Tap.Player_Id End) As Tapjoy_Ios

REGEXP_LIKE通常の式gを使用して、単一のでこれを行うこともできます^t?i~.+

count(Distinct Case When REGEXP_LIKE(Play.Uuid, '^t?i~.+') Then Tap.Player_Id End) As Tapjoy_Ios
  • ^文字列の始まりです
  • t?オプションですt
  • i~文字通りです
  • .+%残りの文字であり、通常の。と同等LIKEです。
于 2012-09-26T02:12:40.917 に答える
1

あなたはただ使用することができますOR

Select Count(Distinct Case When Play.Uuid Like ('i~%')
                          OR Play.Uuid Like ('ti~%') 
                      Then Tap.Player_Id End) As Tapjoy_Ios
From Player_Tapjoy Tap
Inner Join Player Play 
  On Tap.Player_Id = Play.Player_Id
Where Trunc(Tap.Create_Dtime) >= To_Date('2012-Jan-01','yyyy-mon-dd')
于 2012-09-26T02:13:46.010 に答える
1

答えは正しいですが、あなたは間違ったレベルで条件を適用しています。通常、パフォーマンスを向上させるためにデータをフィルタリングする必要がありますが、ここでのLIKE句を使用すると、データの重要性は低くなります。

    Select Count(Distinct Tap.Player_Id) As Tapjoy_Ios
      From Player_Tapjoy Tap
Inner Join Player Play On Tap.Player_Id = Play.Player_Id
     Where Tap.Create_Dtime >= To_Date('2012-Jan-01','yyyy-mon-dd')
       And (Play.Uuid Like ('i~%') OR Play.Uuid Like ('ti~%'))

質問に書かれているように、それはすべての行を処理し、LIKEパターンに一致しない行をフィッシングしていました。また、インデックスを使用できない列に対して関数を実行したくない場合は、日付フィルターを更新しました。あなたは本当にTRUNCを必要としませんでした。

于 2012-09-26T02:30:47.750 に答える