PATINDEX 的纯 T-SQL 全部替换函数
前言
很抱歉由于心情和工作原因,未继续分享,本篇讲介绍定位函数的使用及实现,希望您阅览之后能够交流或提供一些建议。
尽管 SQL Server 是一个功能强大且功能齐全的数据库引擎,但它一直缺乏的一件事就是对正则表达式的支持。这没什么大不了的,因为您不需要(或至少不应该)经常在数据库中需要正则表达式,如果您确实需要它们,您可以随时为其编写一个简单的 C# 扩展,这要归功于SQL CLR。
或者,如果您在本地运行 SQL Server,至少可以。在 Azure 中,这是另一回事。在云中,CLR 仅在您运行托管实例时可用;如果您正在运行单个数据库或弹性池,则它不可用。
如果没有 CLR,就正则表达式而言,您基本上不走运。但是,您可以使用PATINDEX一起破解一些东西。在这篇文章中,我将展示 PATINDEX 的工作原理以及如何使用它来编写一个穷人的模式替换函数。
索引模式
PATINDEX 是 SQL Server 中的内置函数。它在字符串中找到与给定模式匹配的第一个索引。它不支持正则表达式;相反,它支持与LIKE运算符相同的模式。这意味着它可以进行一些有限的通配符模式匹配。
这是一个简单的例子。这个:
SELECT PATINDEX('%[a-z][a-z][a-z]%', 'aa bb ccc dd eee ff')
返回:
…这是输入字符串中第一次出现任何 3 个字符的单词的索引(请记住,SQL 使用基于 1 的索引… shudder)。
PATINDEX 的一些明显限制是:
- 它只支持简单的模式。
- 它只能匹配模式的第一次出现。
- 它不会返回它找到的匹配项。
我们将解决这些限制并创建一个可以接受任何输入字符串和模式的函数,并将模式的所有匹配项替换为其他内容。
花式算法
那么,我们该怎么做呢?一种天真的方法是只对输入进行while循环并继续替换,直到我们找不到更多匹配项为止。当然这不起作用,因为用 AX 替换 A 会使我们陷入无限循环。我们需要确保每场比赛只打一次,而且准确一次。输入中可以有多个匹配项,但 PATINDEX 只会给我们第一个。这建议在我们进行时切割输入字符串。
这是一种解决方法:
该算法找到模式的第一次出现,将之前的所有内容附加到输出,附加替换,然后继续处理剩余的字符串。
它有效,但是缺少一个关键的细节:除了开始索引之外,我们对匹配的模式一无所知,因为这是 PATINDEX 给我们的唯一输出。我们甚至不知道它有多长,这意味着我们不知道要剪切和替换多少输入字符串。
可悲的是,解决它的唯一方法是将其作为输入参数,这意味着我们函数的使用者将负责提供模式以及它将产生的匹配长度。“幸运的是”,PATINDEX 不支持可变长度模式,因此它产生的任何匹配都将始终是相同的长度。
这是我对这个算法的实现:
CREATE FUNCTION dbo.fnReplaceAll
(@input VARCHAR(MAX),@match_pattern VARCHAR(MAX),@match_length INT,@replace_value VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
BEGINDECLARE @output VARCHAR(MAX) = '',@input_copy VARCHAR(MAX) = @input,@match_ix INT;SET @match_ix = PATINDEX(@match_pattern, @input_copy);WHILE @match_ix > 0BEGINSET @output = @output + SUBSTRING(@input_copy, 1, @match_ix - 1) + @replace_value;SET @input_copy = SUBSTRING(@input_copy, @match_ix + @match_length, LEN(@input_copy));SET @match_ix = PATINDEX(@match_pattern, @input_copy);ENDSET @output = @output + @input_copy;RETURN @output;END
很简单,它完成了工作。它是一个纯 T-SQL 函数,这意味着它不需要 CLR 并且可以在 Azure SQL 上运行。
一个小测试:
SELECT dbo.fnReplaceAll('a b c bb c a b aabbccbca a', '%b%', 1, 'bx')
return:
结尾
本篇介绍了不使用CLR实现patindex的检索,这将对于使用azure的用户提供一些技术帮助。
PATINDEX 的纯 T-SQL 全部替换函数相关推荐
- sql server替换函数
'zhangsan.cn'->'zhangsan.com' var str='zhangsan.cn'; update Table set Domain=REPLACE(str,'.cn','. ...
- Sql Server REPLACE函数的使用;SQL中 patindex函数的用法
Sql Server REPLACE函数的使用 REPLACE 用第三个表达式替换第一个字符串表达式中出现的所有第二个给定字符串表达式. 语法 REPLACE ( ''string_replace1' ...
- SQL中CharIndex函数、InStr 函数、PatIndex函数、Stuff函数区别与作用
在c#中可以用字符串的IndexOf方法来判断一个字符串中是否含有指定的字符.而在SQL SERVER中也就相关的函数来实现IndexOf的功能.CharIndex,InStr,PatIndex三个函 ...
- sql server charindex函数和patindex函数详解(转)
charindex和patindex函数常常用来在一段字符中搜索字符或字符串.假如被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数. ...
- SQL Server中替换函数stuff、replace的使用
原文链接:SQL Server中替换函数STUFF.replace的使用 STUFF ( character_expression , start , length ,character_expres ...
- SQL常用字符串函数
SQL常用字符串函数 一.字符转换函数 1.ASCII() 返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用''括起来,但含其它字符的字符串必须用''括起来使用 ...
- SQL字符串处理函数大全
转 查看原文http://www.cnblogs.com/andy2005/archive/2007/12/04/981864.html select语句中只能使用sql函数对字段进行操作(链接sql ...
- Sql Server字符串函数
字符串函数用于对字符和二进制字符进行各种操作 1.ASCII()函数 ASCII(character_expression)函数用于返回字符串表达式中最左侧的ASCII代码值.参数character ...
- oracle sql常用的函数,界别Oracle和SQL Server常用函数
区分Oracle和SQL Server常用函数 一.数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) ...
最新文章
- Java集合篇:HashSet
- android菜鸟学习笔记27----Fragment的简单使用
- springAop的底层技术
- Kernel中如何操作CPU及外设寄存器
- 电脑上我的文档图标不见了怎么办
- 云桌面部署_东胜区检察院检察工作网统一业务系统2.0云桌面终端全面部署完成...
- java大数据组件Kafka
- Linux定义多个标准输入输出,言简意赅解释Linux中的标准输入输出
- NSight统计数据的颜色,缩写意义是什么?来自NV Jeff Kiel 比较官方的解释!
- 我是一只IT小小鸟(转载)
- html mht word,mht格式怎么转换成word
- win10下安装appium
- 拼多多API接口:item_search - 根据关键词取商品列表
- 计算机视觉论文-2021-04-06
- I Irrational Division
- Visual studio 2017 安装
- unity 简易的小地图导航
- OneNET麒麟座应用开发之七:控制采样电机
- 关于装msdn网站纯净版win7正版授权问题(已解决)
- “红山开源”创新论坛 | ChinaOSC
热门文章
- Bugku web(1—35)
- android ROM设置默认Launcher(主屏幕应用)
- Python数据结构与算法基础|第五期:代码实现——循环队列的链式存储结构
- gss1_GSS简介:网格样式表
- 【系统辨识】辨识理论基础及古典辨识方法(随机过程+白噪声+基本概念)
- linux内核中的copy_to_user和copy_from_user(一)
- NLP学习(一)基础篇
- NXP JN5169使用EEPROM/片上FLASH/随机数/内部NVM
- oracle课程设计图书销售系统,oracle课程设计图书管理系统
- 原生js-简易点名册实现