SQL根据通配符和IN子句中的=选择

时间:2018-09-05 20:52:41

标签: sql-server sql-server-2016

我遇到一种情况,我需要选择Customer_ID,这些ID的项目包含关键字“ box”和“ phone”,这意味着最低条件是至少2行,其中一个用于包装盒,一个用于电话盒,都需要显示该customer_ID,顺序无关紧要,但是挑战是例如phone3105557890,字符串部分始终相同,即“ phone”,但最后一部分有所不同,

样本数据

    Customer_ID     item             year
1   222             box              2018
2   222         phone3105557890      2018
3   222             box              2017
4   444             box              2018
5   444             pen              2018
6   444            apple             2018
7   666             table            2018
8   666             box              2018
9   666         phone9995467777      2018

预期结果

    Customer_ID     item             year
1   222             box              2018
2   222         phone3105557890      2018
3   222             box              2017
4   666             table            2018
5   666             box              2018
6   666         phone9995467777      2018

警告:使用select customer_ID from myTable where item = 'box' or item like 'phone%'不能给我我想要的东西,因为我需要框和电话行都作为最低要求显示。这就是为什么444将被过滤掉的原因。

我的尝试:

select customer_ID from myTable where item IN ('box','phone')

但是电话需要通配符where item LIKE 'phone%'

如何结合以上两种逻辑使其工作?我需要声明一个变量吗?

2 个答案:

答案 0 :(得分:3)

您可以使用INHAVING

select *
from myTable
where customer_ID in (select customer_ID 
                      from myTable 
                      where item = 'box' or item like 'phone%' 
                      group by customer_ID 
                      having count(distinct case when item like 'phone%' then 1 else item end) >= 2)

答案 1 :(得分:1)

select customer_ID from myTable where item = 'box' or item like 'phone%'