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