+----+------+---------------------------------------+
| id | dur | workdur |
+----+------+---------------------------------------+
| 1 | 64 | /home/public/users/james/PB_3594162_0 |
| 2 | 123 | /home/public/users/john/PB_990-94162_0 |
| 3 | 13 | /doc/users/jason/PB_0125135 |
| 4 | 355 | /doc/users/jason/notPB |
我可以使用
获取所有PB_select workdur from work where workdur like '%PB_%'
如何按"%PB_"
的部分字符串进行分组,以便我可以获得上述选择的平均值dur
?
注意:在select语句中,不会选择id = 4
答案 0 :(得分:1)
您可以使用此
select avg(dur)
from (select dur from work where workdur like '%PB_%');
您应该注意的一件重要事情是在oracle(一般情况下是sql)中,_
是%
之类的通配符,所以请小心like
因为它等于like '%PB%'
因此,对于您的情况,您应该更改为(并根据@Aleksej的建议删除嵌套)
select avg(dur)
from work
where workdur like '%PB\_%' escape '\';
答案 1 :(得分:1)
您可以简单地将聚合与WHERE
条件一起使用,而无需嵌套查询:
select avg(dur)
from work
where workdur like '%PB_%'
答案 2 :(得分:1)
应该这样做:
CREATE TABLE #test
(
id INT
, dur INT
, workdur VARCHAR(100)
);
INSERT INTO #test (id, dur, workdur)
VALUES (1, 64, '/home/public/users/james/PB_3594162_0')
, (2, 123, '/home/public/users/john/PB_990-94162_0')
, (3, 13, '/doc/users/jason/PB_0125135')
, (4, 355, '/doc/users/jason/notPB');
SELECT AVG(CAST(dur AS FLOAT))
FROM #test
WHERE workdur LIKE '%PB\_%' ESCAPE '\';
我将workdur
转换为FLOAT,因为它会在逗号后显示值(除非您将其存储为FLOAT)。
最重要的是,_
是LIKE
中的特殊符号,如果您想将其视为下划线,则需要进行转义。
答案 3 :(得分:1)
如果您要搜索多个模式,则分组确实很有用,您可以使用大小写:
select
avg(dur),
(case
when workdur like '%PB\_%' then 'PB'
when workdur like 'Other Pattern' then 'Other Pattern'
else 'Not PB' end
) as pb
from work
group by pb