Удаление начальных комментариев из данных столбца для классификации данных

Вопрос или проблема

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

Пример :

Входные данные:
I) \n–комментарий
–комментарий
Выбрать *из test
–комментарий

Выходные данные :
Выбрать *из test
–комментарий

Ii) /комментарий/
Выбрать*из test

Выходные данные :
Выбрать*из test

Iii) /комментарий/
–комментарий
Выбрать*из test
–комментарий
/Комментарий/

Выходные данные :
Выбрать*из test
–комментарий
/Комментарий/

Пример :

Входные данные –

строка запроса категоризация
Выбрать*из abc
–выбрать*из abc
–это комментарий
/* Это комментарий
Выбрать*из cde

Выходные данные должны быть следующими; в настоящее время я получаю не извлеченные данные, если они приходят с комментарием. Мне нужно удалить только ведущие блоки комментариев. Комментарий может быть в одной строке или в нескольких строках, так что различные паттерны могут быть с /*** или — или /* и т.д.

строка запроса категоризация
Выбрать*из abc Извлечь
–выбрать*из abc Извлечь
–это комментарий
/* Это комментарий
Выбрать*из cde Извлечь

Я пытался проверить позицию комментария, но это не работает так, как ожидалось.

Я пробовал это, но это не работает, так как мне просто нужно удалить ведущие комментарии, одиночные или многострочные комментарии :

WITH cleaned_data AS (
    SELECT 
        id,
        -- Очистить ведущие CR (chr(13)) и LF (chr(10))
        LTRIM(TRIM(LEADING chr(10) FROM TRIM(LEADING chr(13) FROM data))) AS cleaned_statement
    FROM abc
),
extracted_comments AS (
    SELECT 
        id,
        -- Извлечь соответствующее SQL выражение или комментарий
        CASE 
            -- Если есть однострочный комментарий
            WHEN POSITION('--' IN cleaned_statement) > 0 THEN
                -- Извлечь все от первого вхождения '--' до конца строки
                TRIM(SUBSTRING(cleaned_statement FROM POSITION('--' IN cleaned_statement)))
            -- Если комментарии не найдены, вернуть очищенное выражение
            ELSE cleaned_statement
        END AS final_statement
    FROM cleaned_data
)
SELECT final_statement
FROM extracted_comments
WHERE final_statement IS NOT NULL
  AND final_statement != '';

Ответ или решение

Удаление ведущих комментариев из данных столбца для классификации данных

В задаче по обработке SQL-запросов вы сталкиваетесь с необходимостью удаления ведущих комментариев, которые могут существовать в различных формах, в том числе однострочные (--) и многострочные (/* */). Мы рассмотрим методы, позволяющие извлечь SQL-запрос и вернуть его с комментариями, находящимися после него.

Проблема

При обработке строк, содержащих SQL-запросы и комментарии, требуется:

  1. Игнорировать все комментарии перед SQL-запросом.
  2. Сохранить любые комментарии, находящиеся после SQL-запроса.
  3. Обрабатывать строки, которые могут содержать как однострочные, так и многострочные комментарии.

Примеры входных и выходных данных

Чтобы проиллюстрировать подход, приведём примеры:

Входные данные:

I) 
-- comment
-- comment
Select * from test
-- comment

II) 
/* comment */
Select * from test

III) 
/* comment */
-- comment
Select * from test
-- comment
/* Comment */

Выходные данные:

I) 
Select * from test
-- comment

II) 
Select * from test

III) 
Select * from test
-- comment
/* Comment */

Методология

Для достижения поставленной цели можно использовать SQL и регулярные выражения. В данном случае мы будем использовать Common Table Expressions (CTE) для предварительной обработки данных.

SQL Запрос для обработки комментариев

WITH cleaned_data AS (
    SELECT 
        id,
        -- Очищаем ведущие пробелы и переносы строк
        LTRIM(TRIM(LEADING chr(10) FROM TRIM(LEADING chr(13) FROM data))) AS cleaned_statement
    FROM abc
),
extracted_comments AS (
    SELECT 
        id,
        -- Извлекаем SQL-запрос и комментарии
        CASE 
            -- Если встречается однострочный комментарий 
            WHEN POSITION('--' IN cleaned_statement) > 0 THEN
                -- Извлекаем всё от первого вхождения '--' до конца строки
                TRIM(SUBSTRING(cleaned_statement FROM 1 FOR POSITION('--' IN cleaned_statement) - 1))
                || COALESCE(SUBSTRING(cleaned_statement FROM POSITION('--' IN cleaned_statement)), '')
            -- Если нет комментариев – возвращаем очищенное выражение
            ELSE cleaned_statement
        END AS final_statement
    FROM cleaned_data
)
SELECT final_statement
FROM extracted_comments
WHERE final_statement IS NOT NULL
  AND final_statement != '';

Объяснение кода

  1. CTE cleaned_data: В этом временном наборе данных удаляются ведущие символы новой строки и пробелы с помощью LTRIM и TRIM.

  2. CTE extracted_comments: В этом разделе кода происходит извлечение SQL-запроса:

    • Если присутствует однострочный комментарий (--), выполняется извлечение всего до первого комментария и добавляются комментарии после запроса.
    • Если однострочных комментариев нет, возвращается очищенное выражение.
  3. Финальный SELECT: Извлекаем окончательное выражение, проверяя на NULL и пустые строки.

Заключение

Таким образом, используя описанную методологию, вы сможете эффективно очищать и извлекать SQL-запросы, применяя регулярные выражения и условия. Это позволит обрабатывать различные формы комментариев и достигать нужных результатов в вашей базе данных.

Такой подход не только автоматизирует процесс, но и гарантирует, что полезные данные будут извлечены с минимальными потерями.

Оцените материал
Добавить комментарий

Капча загружается...