sql:按部分匹配分组

sql:按部分匹配分组,sql,oracle,Sql,Oracle,我可以用它买到所有的PB +----+------+---------------------------------------+ | id | dur | workdur | +----+------+---------------------------------------+ | 1 | 64 | /home/public/users/james/PB_3594162_0 | | 2 | 123 | /

我可以用它买到所有的PB

+----+------+---------------------------------------+
| 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\uquot
的部分字符串进行分组,以便获得上述选择的平均
dur

注意:在select语句中,不会选择id=4

select workdur from work where workdur like '%PB_%'
一件重要的事情您应该注意的是,在oracle(一般来说,sql)中,
是一个通配符,类似于
%
,所以请小心使用
类似的
,因为它等于
类似于“%PB%”

因此,对于您的案例,您应该更改为(并根据@Aleksej的建议删除嵌套)

你可以用这个

select workdur from work where workdur like '%PB_%'
一件重要的事情您应该注意的是,在oracle(一般来说,sql)中,
是一个通配符,类似于
%
,所以请小心使用
类似的
,因为它等于
类似于“%PB%”

因此,对于您的案例,您应该更改为(并根据@Aleksej的建议删除嵌套)


您只需将聚合与
WHERE
条件一起使用,无需嵌套查询:

select avg(dur)
from work 
where workdur like '%PB\_%' escape '\';

您只需将聚合与
WHERE
条件一起使用,无需嵌套查询:

select avg(dur)
from work 
where workdur like '%PB\_%' escape '\';
这应该做到:

select avg(dur)
from work
where workdur like '%PB_%'
我将
workdur
转换为FLOAT,因为这样即使在逗号之后,它也会给出值(除非您将其存储为FLOAT)

除此之外,
\uu
中的一个特殊符号,与
类似,如果要将其视为下划线,则需要对其进行转义。

应该这样做:

select avg(dur)
from work
where workdur like '%PB_%'
我将
workdur
转换为FLOAT,因为这样即使在逗号之后,它也会给出值(除非您将其存储为FLOAT)


除此之外,
\uu
中的一个特殊符号,与
类似,如果要将其视为下划线,则需要对其进行转义。

如果要搜索多个模式,分组确实很有用,您可以使用case:

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 '\';

如果您有多个模式要搜索,分组确实很有用,您可以使用以下用例:

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 '\';

它是什么类型的数据库?oracle和为什么-1?编辑您的问题并显示您想要得到的结果。还可以用您正在使用的数据库标记问题。我的意思是,不
选择平均值(dur)做你想做的事?@GordonLinoff否,因为这将包括第四个数据库,它不是以PB_u@ealeon开头的,因为除了oracle之外还有其他类型的数据库。它是什么类型的数据库?oracle和为什么-1?编辑你的问题并显示你想要的结果。还可以用您正在使用的数据库标记问题。我的意思是,不
选择平均值(dur)做你想做的事?@GordonLinoff不,因为这将包括第四个不以PB_u@ealeon开头的数据库,因为除了oracle之外还有其他类型的数据库。哦,不需要执行组为什么嵌套查询?哦,不需要执行组为什么嵌套查询?