选择列值以字符串开头而不以字符串开头的行

时间:2019-05-05 20:56:51

标签: mysql sql

请考虑以下行

name    StringValue
foo     Mac123

foo     Windows123

foo     Andorid123

bar     Windows123

bar     Andorid123

dumb    Windows123

这是下面的查询返回的结果元组:

select name, stringValue from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
and B.id = C.id
GROUP BY name, stringValue

如何选择名称的stringValue从未包含以“ Mac”开头的字符串,但还需要包含以“ Windows”开头的值的

这应该返回

name
bar
dumb

我所拥有的:

select name, stringValue from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
and B.id = C.id
GROUP BY name, stringValue
Having stringValue LIKE "Windows" and stringValue not LIKE "Mac"

问题:上面的查询返回以“ Windows”开头的所有列。因为如果上半部分条件为真,那么后半部分也为真。

我认为问题与我的工作有关,因为我也没有按要求工作。

如何修改查询,使其返回所有名称,其中具有该名称的任何列的字符串值都不能以Mac开头,也可以以Windows开头。

3 个答案:

答案 0 :(得分:3)

不需要连接。带有特定HAVING子句的聚合应该做到这一点:

SELECT name
FROM t
GROUP BY name
HAVING COUNT(CASE WHEN stringvalue LIKE 'WINDOWS%' THEN 1 END) > 0
AND    COUNT(CASE WHEN stringvalue LIKE 'MAC%'     THEN 1 END) = 0;

DB<>Fiddle

答案 1 :(得分:2)

使用hading子句并检查字符串开头的总和。之所以有效,是因为在MySQL中,布尔表达式的false值为0,为true的1

SELECT name
       FROM a
            INNER JOIN b
                       ON b.id = a.id
            INNER JOIN c
                       ON c.id = b.id
       GROUP BY name
       HAVING sum(stringvalue LIKE 'Mac%') = 0
              AND sum(stringvalue LIKE 'Windows%') > 0;

答案 2 :(得分:0)

此查询:

select name, stringValue 
from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
  and B.id = C.id
GROUP BY name, stringValue

表现得与众不同

要执行所需的操作,只需在过滤器中添加一些通配符即可:

select name, stringValue 
from TABLE1 A, TABLE2 B, TABLE13 C
where A.id = B.id
  and B.id = C.id
  and stringValue LIKE "Windows%"
GROUP BY name, stringValue