无意中得到一个pdf,上边写着数据库中可以写正则 ,看下边代码
select * from userinfo where username like 'A%P' or username like 'B%P' or username like 'C%P'
可以被下边的替换
select * from userinfo where REGEXP_LIKE(username,'^[A,C]p$')
create table userinfo(username nvarchar(50),password nvarchar(20),email nvarchar(50) not null, phone nvarchar(50) not null,hobbies nvarchar(2000)) insert into userinfo(username,password,email,phone,hobbies)values ('jason','steve123','[email protected]','515-123-4567','football,writing,Cricket')
insert into userinfo(username,password,email,phone,hobbies)values ('jason','steve123','[email protected]','515-123-4567','football,writing,Cricket')
insert into userinfo(username,password,email,phone,hobbies)values ('BjasonP','steve123','[email protected]','515-123-4567','football,writing,Cricket')
insert into userinfo(username,password,email,phone,hobbies)values ('AjasonP','steve123','[email protected]','515-123-4567','football,writing,Cricket')
select * from userinfo where REGEXP_LIKE(username,'^[A,C]p$') select * from userinfo where username like 'A%P' or username like 'B%P' or username like 'C%P'
oracle支持REGEXP_LIKE、mysql支持REGEXP,可悲的sqlserver不支持.....
oracle的童鞋可以试下上边的代码 应该是没有问题的 因为没有环境测试不了
--------------------------------------
跟群友讨论得出以下结果:可以用c#写扩展..
sql从05开始支持用C#写扩展的
这样直接可以用C#的正则表达式了
以前都是通过esp实现
我只写过几次esp
用delphi的时候
sp = stored procedure 存储过程
esp = extand stored procedure 俗称,扩展存储过程
一般是用其他语言写的,符合sql接口的函数,用dll封装起来
可以在sql中调用
从05开始,这种方案就不推荐了
因为可以直接用C#写了
顺便讨论了下clr
clr的全称是 common language runtime
IL就是编译好的,存在dll里面的
C#代码编程成IL代码,而不是native代码
包括IL代码的dll,由clr来调用
native代码是可以直接执行的
clr把il代码通过jit编译成native执行
多了一层,所以比native效率低一点
native:本机
--------------------------------------
然后碰巧看到这个http://www.cnblogs.com/tylerdonet/archive/2011/05/26/2058980.html#2244667
然后俺第一个模仿的c#扩展新鲜出炉了 以下是 数据库操作部分 c#部分上边的链接里有
c#部分新建一个类库 写上下边第一部分代码生成dll 记住路径 就OK了 剩下的事交给sql
c#
using System; using System.Collections.Generic; using System.Text; using System.Data.SqlTypes; using System.Text.RegularExpressions; using Microsoft.SqlServer.Server; namespace RegExp { public partial class RegExp { [SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)] public static SqlString RegexReplace(SqlString input, SqlString pattern, SqlString replacement) { return (SqlString)Regex.Replace(input.Value, pattern.Value, replacement.Value); } } }
sql
--在SQL Server中开启CLR调用功能 exec sp_configure 'clr enabled', 1; reconfigure; --------------------- --use master; --运行下面的语句从这个dll中抽取中间语言(IL)注意路径 create assembly RegExp from 'D:\学习\lianxi\Regex\Regex\bin\Debug\Regex.dll' --------------------------------------------------- --写个函数引用外部程序集 create function dbo.RegexReplace( @input as nvarchar(max), @pattern as nvarchar(max), @replacement as nvarchar(max)) returns nvarchar(max) with returns null on null input--只要调用函数的时候任何一个参数为null,函数返回值将会是null。 external name [RegExp].[RegExp.RegExp].[RegexReplace]--[程序集].[命名空间.类].[方法](我认为是这样-_-) go ------------------------ --将China中的字母z替换成z select dbo.RegexReplace('china','a','Z')
是不是觉得很强大呢
如果很复杂的sql 可以使用这种方法
想了解更多的在SQL Server中使用assemblies 点击下边的链接:
下载
英文版的 俺是英盲 不过里边的代码还是稍微能看懂的 这不帮助原作者指出了错误了么
您如果看到中文版 请再文后回复 Thank you
|
请发表评论