当前位置: 首页 > 面试题库 >

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

巫马望
2023-03-14
问题内容
  • 单行注释(例如,我的注释)应删除。
  • 多行注释(例如/ 我的注释 /)应删除。
  • 字符串文字的内容(例如,“这是多行注释:/ 我的注释 /”)应被忽略。
  • 标识符的内容(例如“-第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 */

问题答案:

解决方案

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


 类似资料:
  • 问题内容: 有什么方法可以通过JPA注释指定SQL注释?表和列的注释。 问题答案: 有什么方法可以通过JPA注释指定SQL注释?表和列的注释。 否。如果要定义表和列注释,最好的选择是在生成的DDL中根据事实进行操作,然后再对数据库执行操作。

  • 问题内容: 我有一张桌子,如下所示: 我想基于3个字段emp_name,emp_address和sex删除重复的条目。和我的结果表(删除重复项后)应类似于- 我不记得如何为此编写SQL查询。任何人都可以帮忙吗? 问题答案: 看起来所有四个列值都是重复的,因此您可以执行以下操作- 但是,如果婚姻状况可能有所不同,并且您还有其他根据其选择的列(例如,您希望基于create_date列作为最新记录),则

  • 问题内容: 我试过了 : 它返回了3列“ TABLE_NAME”,“ TABLE_TYPE”和“ COMMENTS”,但是“ TABLE_NAME”列就像“ encrypted”一样,我需要明确的表名: 我使用TABLE_NAME时未“加密”。 问题答案: 由于10g,Oracle在发出DROP TABLE语句时不会立即删除表。相反,它像这样重命名它们并将它们放入回收站。这使我们能够恢复原本不想删

  • 问题内容: 我在清理注释和已存在的sql文件中的空行时遇到问题。该文件有1万多行,因此无法手动清洁。 我有一些python脚本,但是我不知道如何处理多行插入内容中的注释。 代码: 它应该如何工作: 这应该清洗: 这应该保持原样: 问题答案: 尝试使用sqlparse模块。 更新的示例: 将注释保留在插入值内,并将注释保留在CREATE FUNCTION块内 。您可以进一步调整以调整行为: 输出:

  • 问题内容: 我正在创建需要将服务连接到sql server的应用程序。添加依赖项后运行测试代码时,它成功运行。这是成功运行的测试代码: 但是,当我为jdbc添加依赖项并在创建服务时运行相同的代码时,它给了我类似以下的错误: 我在pom.xml中添加了此依赖项: 我应该进行哪些更改,以便在创建服务时成功建立连接? 问题答案: 您的依赖项的范围是,这意味着当应用程序正常运行(而不是作为测试)时,它将不

  • 问题内容: 我对Oracle SQL查询并不十分了解,因此在删除表中的某些行时遇到了一个问题,该行必须满足一个约束,该约束包括另一个(联接)表的字段。换句话说,我想编写一个查询来删除包括JOIN的行。 在我的情况下,我有一个表和另一个连接在字段上的表。我想从大于或等于200的行中删除行,并且它们引用的产品具有名称“ Mark”(名称是“产品”中的一个字段)。 我想首先被告知Oracle中的Dele