SQL Oracle - 想要为案例添加另一个“喜欢”条件

时间:2012-09-26 02:10:32

标签: sql oracle

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~%')..但这似乎不起作用。我怎么能实现这个呢?

3 个答案:

答案 0 :(得分:1)

您需要两个由逻辑LIKE连接的完整OR子句,每个子句都包含LIKE关键字的左侧和右侧(左侧列,右侧字符串值) )。

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

您也可以使用常规表达式^t?i~.+使用单个REGEXP_LIKE执行此操作:

count(Distinct Case When REGEXP_LIKE(Play.Uuid, '^t?i~.+') Then Tap.Player_Id End) As Tapjoy_Ios
  • ^是字符串的开头
  • t?是可选的t
  • i~是字面意思
  • .+是剩余字符,相当于常规%中的LIKE

答案 1 :(得分: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')

答案 2 :(得分: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。