当其他列有两个特定值时选择一个值

当其他列有两个特定值时选择一个值

问题描述:

我找不到一种方法来完成这项工作:我需要获得所有id1id2''(empty string)以及一个至少非空id2当其他列有两个特定值时选择一个值

我得到这个为:SELECT id1, id2 FROM mytable WHERE id1 = ... GROUP BY id1,id2

id1            id2 
1 b2-04af1ab73705-fb8000-006bfb81a78e5e5920 
2 b2-04af1ab73705-fb8000-006bfb81a78e5e5920  5835113447594857813 

所以现在我需要得到这个id1。我尝试了很多东西,但最接近的是得到truefalse如果条件满足,但不能得到各自的id1与它 - 我需要它,因为我想在较大的集合上运行(不是mytable是在id1=...子集) 。

当我尝试这样的:

SELECT if(sum(if(tab1.id1 != '', 1, 0)) < count(tab1.id2), tab1.id1,false) as myguy 
     FROM 
      ( SELECT id1,id2 
        FROM mytable 
       WHERE id1 = 'b2-04af1ab73705-fb8000-006bfb81a78e5e5920' 
         GROUP BY visitorid,platformvisitorid 
      ) AS tab1 

,我得到这个错误:Line 1:103 Expression not in GROUP BY key 'visitorid'并不能找到办法解决它。

有什么想法吗?

编辑:

与丹尼斯的帮助下解决了这个问题,如下所示:

SELECT tab4.id1 FROM 

(SELECT tab1.id1 FROM (SELECT id1, id2 FROM mytable GROUP BY id1, id2) tab1 WHERE id2!='') tab3 

INNER JOIN 

(SELECT tab2.id1 FROM (SELECT id1, id2 FROM mytable GROUP BY id1, id2) tab2 WHERE id2='') tab4 
ON (tab3.id1 = tab4.id1) 

编辑

这显然是有可能做到这一点在1路走,以防止污染您的数据库。见@Dudu Markovitz


答案这可能是不可能建立这种成1条语句,从而消除临时表(或视图)的创建。

CREATE TABLE tempa AS SELECT DISTINCT id1 from mytable where id2 = ''; 
CREATE TABLE tempb AS SELECT DISTINCT id1 from mytable where id2 != ''; 

SELECT tempa.id1 FROM tempa INNER JOIN tempb on tempa.id1 = tempb.id1; 

请注意,'not empty'不是一个明确的定义,所以您可能需要调整第二行中的where语句以满足您的需求。

+0

哦,是的,我走了一个可怕的复杂的方式。我使用select和join两个选项,然后采用不同的'id1'!感谢您指出这个想法:) 我会在我的问题编辑 –

+0

认真? .................. –

select  id1 
from  mytable 
group by id1 
having  count(case when id2 = '' then 1 end) > 0 
     and count(case when id2 <> '' then 1 end) > 0 
+1

这应该是被接受的答案。 – leftjoin

+0

很不错,不知道HQL支持这样复杂的句子! –