带正则表达式的参数化 SQL、ORACLE 与 SQL Server

Posted

技术标签:

【中文标题】带正则表达式的参数化 SQL、ORACLE 与 SQL Server【英文标题】:Parameterized SQL, ORACLE vs SQL Server with regular expression 【发布时间】:2016-05-05 22:03:20 【问题描述】:

Oracle 和 Sql 服务器对参数化字符串中的参数使用不同的前缀。

Sql 使用@p1

ORA 使用:p1

我只想在我的 SQL 中使用 @,如果使用 ORA 数据库,所有 : 字符都应替换为 @

你能帮我创建正则表达式吗?

这里是一些示例 SQL:

update test_table set text = :p1 where text = 'jana:klara' or some_value = :value or info = 'two'

可以在here找到类似的问题和替代解决方案。

【问题讨论】:

【参考方案1】:

您可以使用此模式进行搜索:

(?<=\W):(?=\w+)

例如:

string output = Regex.Replace(input, @"(?<=\W):(?=\w+)", "@");

这是模式的含义:

(?&lt;=\W) - (?&lt;= ... ) 语法声明了积极的后视。换句话说,任何匹配都必须在后视的内容之前。在这种情况下,它声明匹配必须以非单词字符开头。 : - 只匹配冒号 (?=\w+) - (?= ... ) 语法声明了积极的前瞻。换句话说,任何匹配都必须跟前瞻的内容。在这种情况下,它声明匹配必须后跟一个或多个单词字符。

请参阅online demo。

我想不出为什么参数会成为输入字符串中的第一个参数,但如果可能的话,将其更改为 (?&lt;=^|\W):(?=\w+) 也可以解决这种情况。

【讨论】:

我发现替换这个 UPDATE B_BSET SET VALUE_DATE = '14.07.2011' WHERE BATCH_NAME = ':BWAG_ALM2' 不能正常工作。 :BWAG_ALM2 更改为@BWAG_ALM2。有什么想法吗? 这个:(?=(?:'[^']*'|[^'\n])*$) 怎么样?我认为这工作正常。【参考方案2】:

正确的正则表达式:

 statement = Regex.Replace(statement, @":(?=(?:'[^']*'|[^'\n])*$)", "@");

【讨论】:

以上是关于带正则表达式的参数化 SQL、ORACLE 与 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

oracle 判断字段是否为是数字 regexp like用法 正则表达式

oracle 判断字段是否为是数字等 regexp_like用法 正则表达式

(Oracle) SQL 中的正则表达式将日期/时间拆分为单独的日期和时间列

一分钟带你了解正则

用于转换为 oracle pl/sql 的电子邮件的 salesforce 正则表达式

oracle SQL 正则表达式