SQL/Regex Challenge/Puzzle:如何从 SQL 代码中删除注释(通过使用 SQL 查询)?

Posted

技术标签:

【中文标题】SQL/Regex Challenge/Puzzle:如何从 SQL 代码中删除注释(通过使用 SQL 查询)?【英文标题】:SQL/Regex Challenge/Puzzle: How to remove comments from SQL code (by using SQL query)? 【发布时间】:2017-02-16 02:34:36 【问题描述】:

要求

应删除单行 cmets(例如 -- 我的评论)。 应该删除多行 cmets(例如 /* my comment */)。 应忽略字符串文字的内容(例如,“这是一个多行注释:/* 我的注释 */”)。 应忽略标识符的内容(例如“-- 第 1 列--”)。

文字和标识符

文字和标识符可以跨越多行

单行cmets

单行注释可能是代码的最后一个元素,并且可能不以换行符结尾。

嵌套多行 cmets

在SQL Server、PostgreSQL等数据库中,可以嵌套多行cmets,例如-

/* outer comment /* inner comment */ */

以下代码无效,因为只关闭了内部注释:

/* opened outer comment /* closed inner comment */

在 Teradata、Oracle、mysql 和 SQLite 等数据库中,没有嵌套 cmets 的概念。 以下代码无效,因为注释已经用最左边的 */ 关闭了。

/* comment /* is closed */ ERROR */

这是一个有效的代码:

/* comment /* still the same comment */

【问题讨论】:

这不是问题。 *** 是一个问答网站。通过提出一个问题来使您的帖子合法化,如何从 SQL 查询中剥离 cmets? 并将其作为答案发布。回答你自己的问题是完全值得尊重的,但你必须遵守 *** 机制。 或者,给自己写一个博客。 【参考方案1】:

解决方案

Teradata

with t (txt) as 
(
select     '
            select    /* comment /* yada yada yada /* / // bla bla bla  
                        1
                                    */ t1.i
                   ,''"SRC''''"''    as "This''is''the
                                ''source"

            from      t1 /* "Comment 2" - '' */ cross join t2 -- /* comment 3 */

            where     t2.v = ''/*DST"*
                                /'' -- comment 4'
)

select    regexp_replace (txt,'(''.*?''|".*?")|/\*.*?\*/|--.*?(?=[\r\n]|$)','\1',1,0,'n')     as clean_txt

from      t
;

甲骨文

with t (txt) as 
(
select     '
            select    /* comment /* yada yada yada /* / // bla bla bla  
                        1
                                    */ t1.i
                   ,''"SRC''''"''    as "This''is''the
                                ''source"

            from      t1 /* "Comment 2" - '' */ cross join t2 -- /* comment 3 */

            where     t2.v = ''/*DST"*
                                /'' -- comment 4'

from        dual
)

select    regexp_replace (txt,'(''.*?''|".*?")|/\*.*?\*/|--.*?(?=$|\Z)','\1',1,0,'nm')

from      t
;

结果

            select     t1.i
                   ,'"SRC''"'    as "This'is'the
                                'source"

            from      t1  cross join t2 

            where     t2.v = '/*DST"*
                                /'

【讨论】:

以上是关于SQL/Regex Challenge/Puzzle:如何从 SQL 代码中删除注释(通过使用 SQL 查询)?的主要内容,如果未能解决你的问题,请参考以下文章

SQL REGEX 搜索表名

SQL Regex substr模式匹配

SQL Regex - 选择“/”之后的所有内容并拆分为数组

PL/SQL Regex 查找最后一个数字并拆分

SQL Regex - 用另一个字段的子字符串替换

Bigquery SQL Regex - 字符串的开始/结束或不跟随/跟随任何字母