小编典典

SQL / Regex挑战/难题:如何从SQL代码中删除注释(通过使用SQL查询)?

sql

要求

  • 单行注释(例如,我的注释)应删除。
  • 多行注释(例如/ 我的注释 /)应删除。
  • 字符串文字的内容(例如,“这是多行注释:/ 我的注释 /”)应被忽略。
  • 标识符的内容(例如“-第1列-”)应被忽略。

文字和标识符

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

单行注释

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

嵌套的多行注释

在SQL Server和PostgreSQL等数据库中,可以嵌套多行注释,例如-

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

由于仅关闭内部注释,因此以下代码无效:

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

在Teradata,Oracle,MySql和SQLite等数据库中,没有嵌套注释的概念。由于注释已用最左边的* /结束,因此以下代码无效。

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

但是,这是有效的代码:

/* comment /* still the same comment */

阅读 164

收藏
2021-04-14

共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
;

Oracle

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"*
                                /'
2021-04-14