从列数据中删除前导注释以对数据进行分类

问题描述 投票:0回答:1

如何从具有前导注释的字符串中提取 SQL 查询,并返回查询以及查询后的任何注释,同时忽略查询之前的任何注释。

示例:

输入: 我) - 评论 - 评论 从测试中选择* --评论

输出: 从测试中选择* --评论

II) /评论/ 从测试中选择*

输出: 从测试中选择*

III) /评论/ - 评论 从测试中选择* - 评论 /评论/

输出: 从测试中选择* - 评论 /评论/

示例:

输入-

查询字符串 分类
从 abc 选择*
--从 abc 中选择*
--这是评论
/* 这是评论
从 cde 选择*

输出应如下所示,如果带有评论,我将得到非摘录。我只需要删除前导注释块。注释可以出现在一行多行中,因此不同的模式可以是 /*** 或 -- 或 /* 等。

查询字符串 分类
从 abc 选择* 摘录
--从 abc 中选择* 摘录
--这是评论
/* 这是评论
从 cde 选择* 摘录

我尝试检查评论示例的位置,但它没有按预期工作。

我尝试过用这个来处理“--”,但不起作用,因为我只需要删除前导注释单行或多行注释:

WITH cleaned_data AS (
    SELECT 
        id,
        -- Clean leading CR (chr(13)) and 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,
        -- Extract relevant SQL statement or comment
        CASE 
            -- If there is a single-line comment
            WHEN POSITION('--' IN cleaned_statement) > 0 THEN
                -- Extract everything from the first occurrence of '--' to the end of the line
                TRIM(SUBSTRING(cleaned_statement FROM POSITION('--' IN cleaned_statement)))
            -- If no comments found, return the 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 != '';
postgresql postgresql-9.5
1个回答
0
投票
SELECT REGEXP_REPLACE (data, '^.*(SELECT)', '\1', 'i')
FROM   abc;

我们使用正则表达式来匹配 SELECT 关键字之前的所有字符(包括 SELECT 关键字)。我们将 SELECT 放在正则表达式的括号中,以便我们可以存储模式,该模式在第三个参数中发出。第四个参数告诉在匹配正则表达式时忽略大小写。

© www.soinside.com 2019 - 2024. All rights reserved.