如何从具有前导注释的字符串中提取 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 != '';
SELECT REGEXP_REPLACE (data, '^.*(SELECT)', '\1', 'i')
FROM abc;
我们使用正则表达式来匹配 SELECT 关键字之前的所有字符(包括 SELECT 关键字)。我们将 SELECT 放在正则表达式的括号中,以便我们可以存储模式,该模式在第三个参数中发出。第四个参数告诉在匹配正则表达式时忽略大小写。