带正则表达式的参数化 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+)", "@");
这是模式的含义:
(?<=\W)
- (?<= ... )
语法声明了积极的后视。换句话说,任何匹配都必须在后视的内容之前。在这种情况下,它声明匹配必须以非单词字符开头。
:
- 只匹配冒号
(?=\w+)
- (?= ... )
语法声明了积极的前瞻。换句话说,任何匹配都必须跟前瞻的内容。在这种情况下,它声明匹配必须后跟一个或多个单词字符。
请参阅online demo。
我想不出为什么参数会成为输入字符串中的第一个参数,但如果可能的话,将其更改为 (?<=^|\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 中的正则表达式将日期/时间拆分为单独的日期和时间列