SQL Server中自定义函数:用指定的分隔符号分割字符串
微软SQL Server数据库中包含了很多内置的函数,入下图:


它们用于处理日期、数学、元数据、字符串等。
其中最为常用的就是处理字符串,里面包含了CharIndex()等函数,非常方便使用。
但是对于 特殊字符串的处理,比如:ISBN号 '978-7-5007--7',如果想获取第三个与第四个分割符号之间的数字,
那么SQL 内置函数无法直接做到。这时就需要自定义函数。下面自定义三个函数,用于处理特殊的字符串。
ALTER FUNCTION [dbo].[Fun_GetStrArrayLength]
(
@originalStr VARCHAR(1024), --要分割的字符串
@split VARCHAR(10) --分隔符号
)
RETURNS INT
AS
BEGIN
DECLARE @location INT; --定义起始位置
DECLARE @start INT; --定义从第几个开始
DECLARE @length INT; --定义变量,用于接收计算元素的个数 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右两侧的空格 SET @location = CHARINDEX(@split, @originalStr); --分割符号在字符串中第一次出现的位置(索引从1开始计数) SET @length = 1; WHILE @location <> 0
BEGIN
SET @start = @location + 1;
SET @location = CHARINDEX(@split, @originalStr, @start);
SET @length = @length + 1;
END
RETURN @length;
END
调用函数:select dbo.Fun_GetStrArrayLength('978-7-5007-7234-7','-')
结果:5
ALTER FUNCTION [dbo].[Fun_GetStrArrayStrOfIndex]
(
@originalStr VARCHAR(1024), --要分割的字符串
@split VARCHAR(10), --分隔符号
@index INT --取第几个元素
)
RETURNS VARCHAR(1024)
AS
BEGIN
DECLARE @location INT; --定义第一次出现分隔符号的位置
DECLARE @start INT; --定义开始位置
DECLARE @next INT; --定义下一个位置
DECLARE @seed INT; --定义分割符号的长度 SET @originalStr = LTRIM(RTRIM(@originalStr)); --去除字符串左右2侧空格
SET @start = 1;
SET @next = 1;
SET @seed = LEN(@split); SET @location = CHARINDEX(@split, @originalStr); --第一次出现分隔符号的位置 WHILE @location <> 0
AND @index > @next
BEGIN
SET @start = @location + @seed;
SET @location = CHARINDEX(@split, @originalStr, @start);
SET @next = @next + 1;
END IF @location = 0
BEGIN
SELECT @location = LEN(@originalStr) + 1;
END --存在两种情况:
--1、字符串不存在分隔符号。
--2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 RETURN SUBSTRING(@originalStr, @start, @location -@start);
END
调用函数:select dbo.Fun_GetStrArrayStrOfIndex('978-7-5007-7234-7','-',4)
结果:7234
ALTER FUNCTION [dbo].[Fun_SplitStr]
(
@originalStr VARCHAR(8000), --要分割的字符串
@split varchar(100) --分隔符号
)
RETURNS @temp TABLE(Result VARCHAR(100))
AS
BEGIN
DECLARE @result AS VARCHAR(100); --定义变量用于接收单个结果 SET @originalStr = @originalStr + @split ; WHILE (@originalStr <> '')
BEGIN
SET @result = LEFT(@originalStr, CHARINDEX(@split, @originalStr, 1) -1) ; INSERT @temp VALUES(@result) ; --STUFF()函数用于删除指定长度的字符,并可以在指定的起点处插入另一组字符。
SET @originalStr = STUFF(@originalStr, 1, CHARINDEX(@split, @originalStr, 1), '');
END
RETURN
END
调用示例:select * from dbo.Fun_SplitStr('978-7-5007-7234-7','-')
结果: 978
7
5007
7234
7
SQL Server中自定义函数:用指定的分隔符号分割字符串的更多相关文章
- SQL Server中排名函数row_number,rank,dense_rank,ntile详解
SQL Server中排名函数row_number,rank,dense_rank,ntile详解 从SQL SERVER2005开始,SQL SERVER新增了四个排名函数,分别如下:1.row_n ...
- SQL Server中COALESCE函数的用法
在SQL Server中COALESCE函数,会返回其参数中第一个不为NULL的参数,效果如下: SELECT COALESCE(NULL,NULL,N'A',NULL,NULL) 结果: SELEC ...
- Oracle中INSTR函数与SQL Server中CHARINDEX函数
Oracle中INSTR函数与SQL Server中CHARINDEX函数 1.ORACLE中的INSTR INSTR函数格式:INSTR(源字符串, 目标字符串, 起始位置, 匹配序号) 说明:返回 ...
- sql server中常用方法函数
SQL SERVER常用函数 1.DATEADD在向指定日期加上一段时间的基础上,返回新的 datetime 值. (1)语法: DATEADD ( datepart , number, date ) ...
- sql server中quotename()函数的用法(转载)
操作sql server尤其是写存储过程时,要用到各种各样的函数,今天就总结一个quotename()的用法.1.语法: quotename('character_string'[,'quote_ch ...
- sql server中QUOTENAME()函数的用法
操作sql server尤其是写存储过程时,要用到各种各样的函数,今天就总结一个quotename()的用法. 1.语法: quotename('character_string'[,'quote_c ...
- SQL Server中row_number函数的简单用法
一.SQL Server Row_number函数简介 ROW_NUMBER()是一个Window函数,它为结果集的分区中的每一行分配一个连续的整数. 行号以每个分区中第一行的行号开头. 以下是R ...
- sql server 中DateName()函数及DatePart()函数
Datepart():返回代表指定日期的指定日期部分的整数 语法:Datepart(datepart,date) 返回类型:int DateName():返回代表指定日期的指定日期部分的字符串 语法 ...
- Sql Server中REPLACE函数的使用
在sql的使用过程当中,我们偶尔会遇到这样一种情况,就是需要改变数据的存储形式,比如数据库某一张表(Info)当中有一个字段Educational(学历),以前存储的是Json数组,现在由于需求的改变 ...
随机推荐
- Android中验证输入是否为汉字、手机号及邮箱
1,验证是否为汉字 Code// 验证昵称 private boolean verifyNickname() { String nickname = edt_username.getText().to ...
- 41)django-admin
一:介绍 通过django admin可以快速生成后台管理功能. 二:设置 工程同名下settings.py 1)在INSTALLED_APPS中增加django.contrib.admin 2)在I ...
- SQL*Plus工具
或者
- Spark-SQL之DataFrame操作
Spark SQL中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现.可以参考,Scala提供的DataFra ...
- LeetCode(96): 不同的二叉搜索树
Medium! 题目描述: 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: ...
- cf14d 树的直径,枚举删边
#include<bits/stdc++.h> using namespace std; #define maxn 300 ]; int n,head[maxn],tot,a,b,dis[ ...
- OrCAD Capture CIS 16.6 修改原理图的页面大小
OrCAD Capture CIS 16.6 打开需要修改的原理图. 菜单:Options > Schematic Page Properties... 看图操作...
- 极光推送>>java SDK服务端集成后台项目(使用详解)
PS:如果你是第一次用推送,那就直接按照我的步骤来,再去看官方文档,这样,更容易能理解操作流程.还有——-请耐心看 极光文档(java SDK)请参考 [ 极光文档 ] 步骤一: 首先,你必须在 [极 ...
- jmeter 控制线程组执行顺序
这个要配合全局变量.if和while来实现BeanShell取样器,全局变量:${__setProperty(newswitch,${switch1},)}if条件:"${__P(newsw ...
- C++ Primer 笔记——固有的不可移植的特性
1.为了支持底层编程,C++定义了一些固有的不可移植的特性,所谓不可移植特性是指因机器而异的特性. 2.一个位域中含有一定数量的二进制位,位域在内存中的布局是机器相关的.位域的类型必须是整型或枚举类型 ...