sql:按部分匹配分组

时间:2016-04-21 14:08:09

标签: sql oracle

+----+------+---------------------------------------+
| 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

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