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 查询)?的主要内容,如果未能解决你的问题,请参考以下文章