Поиск строки в строке в выражении SQL - PullRequest
1 голос
/ 16 июня 2011

У меня есть столбец, в котором отображаются названия проектов, через которые прошла наша компания, в другом столбце указаны часы, отработанные для каждого проекта.

Названия проектов содержат ключевые слова, ключевые слова определяются в формате «ключевое слово:».например, 'ETL:'

В некоторых проектах есть несколько ключевых слов, например, 'Клиент: ETL: ASCX:'

Так, например, заголовок проекта может быть "Клиент: ETL: ASCX: обновить импорт".process '

Я не знаю ключевых слов заранее.

Мне нужно общее количество часов и проектов для данного ключевого слова. Итак, давайте использовать следующие два заголовка проекта в качествепример:

  • Клиент: ETL: ASCX: на него было потрачено 20 часов работы.
  • Клиент: ETL: Bridge: в него вложено 10 часов работы.

В отчете должно быть указано:

Keyword - Total Projects - Total Hours
Client: - 2 -30
ETL: - 2 - 30
ASCX: - 1 - 20
Bridge: - 1 - 10

Получение первого экземпляраключевое слово просто - просто подстрока;но поиск вложенного ключевого слова оказывается трудным.

Можно ли выполнять вложенные поиски в SQL?

любых получателей?

ОБНОВЛЕНИЕ (первоначально опубликовано как"answer"):

Дополнительные примеры:

Допустим, у меня есть две записи со следующими названиями проектов:

Record 1: Interface: ETL:
Record 2: ETL:

Запись 1 имеет 10 часов, а запись 2 имеет30 часов.

Прямо сейчас мой код захватывает первый экземпляр ключевого слова, поэтому мой вывод прямо сейчас (ключевое слово: часы)

ETL: 30
Interface: 10

Однако требуется показать, что ETL имеетВыделено 40 часов, так как два проекта имели ETL в качестве ключевого слова:

ETL: 40
Interface: 10

Так что я могу использовать LIKE, чтобы найти все экземпляры ETL или Interface, но мне нужно разбить выбор в каждом из них.ключевое слово.Например, в приведенном выше примере, если бы я использовал «% ETL:%», я получил бы обе записи, но я хочу видеть все часы для всех ключевых слов с разбивкой по ключевым словам.

Может быть, лучший вопросбыть:

Как я могу получить запись, которая выглядит следующим образом:

Interface: ETL:

В вывод, который выглядит так:

Interface:
ETL:

в sql?

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Не очень красиво, но вы можете использовать выражение MODEL для разделения (только в одну сторону).Предполагая, что у вас есть отдельные таблицы project и project_hours со связями через поле идентификатора:

create table projects as (
    select 'Client: ETL: ASCX: update the import process' as project_title,
        1 as project_id from dual
    union all select 'Client: ETL: Bridge: something else', 2 from dual
    --union all select 'Interface: ETL:', 3 from dual
    --union all select 'ETL:', 4 from dual
)
/

create table project_hours as (
    select 1 as project_id, 20 as hours from dual
    union all select 2, 10 from dual
    --union all select 3, 10 from dual
    --union all select 4, 30 from dual
)
/

This:

with tmp_tab as (
    select project_id, trim(t) as keyword, i
        from projects
        model
        return updated rows
        partition by (project_id)
        dimension by (0 i)
        measures (project_title t)
        rules (t[for i from 1 to
                (length(regexp_replace(':' || t[0],'[^:]')) - 1) increment 1]
            = regexp_substr(t[0],'[^:]+',1,cv(i)))
    order by project_id, i
)
select tt.keyword,
    count(distinct tt.project_id) as total_projects,
    sum(h.hours) as total_hours
from tmp_tab tt
left join project_hours h on h.project_id = tt.project_id
group by tt.keyword
/

Дает это:

KEYWORD                          TOTAL_PROJECTS     TOTAL_HOURS        
-------------------------------- ------------------ ------------------ 
Bridge                           1                  10                 
ETL                              2                  30                 
Client                           2                  30                 
ASCX                             1                  20                 

Редактировать Или, если ваш второй набор примеров включен, дает:

KEYWORD                          TOTAL_PROJECTS     TOTAL_HOURS        
-------------------------------- ------------------ ------------------ 
ETL                              4                  70                 
Bridge                           1                  10                 
Interface                        1                  10                 
Client                           2                  30                 
ASCX                             1                  20                 

Адаптировано из ответа здесь - поэтому любой кредит должен перейти к Роб ван Вийк действительно.

Я предположил, что за ключевыми словами всегда следует двоеточие, и все, что после последнего двоеточия, не должно рассматриваться как ключевое слово, которое просто требует добавления -1 кlength().

0 голосов
/ 16 июня 2011
select count(*) as projectcount, sum(hours) as totalhours from projects WHERE title like '%mykeyword:%';
...