sql 自定义split
以下数据库操作针对sql server.
问题来源:由于项目中,有的表字段内容是由多个id或多个其他内容拼接而成.(如:'1,2,3,4,5',或者'name_age_school'),特点是都用某个分隔符储存.
要取得其中的某部分数据内容或者验证某个数据是否在其中.
方案一 是将数据读取到程序中,然后用程序去操作数据,将数据分割为数组,然后进行操作.最好将分割操作放到一个公用的函数库中.
方案二:由于我遇到的问题是将其中的 "name" 替换为 "name_age_shcool"中的名字,这两个名字不一致且以后者中的为准. 因此实际意义并没有多大用途.但是客户需求,如果按照方案一的操作,我又将改动后端实现部分.且接口一要修改.
于是在DB中完成这个字符内容的截取的想法产生了.
解决方式:
USE [StudentDB]
GO
/****** Object: UserDefinedFunction [dbo].[splitSTR] Script Date: 2016/11/24 16:05:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create FUNCTION [dbo].[splitSTR](
@s varchar(5000), --待分拆的字符串
@split varchar(10) --分隔符
)RETURNS @result TABLE(id int ,content varchar(100))
AS
BEGIN
DECLARE @splitlen int
DECLARE @id int
SET @splitlen=LEN(@split+'a')-2
SET @id=1
WHILE CHARINDEX(@split,@s)>0
BEGIN
INSERT @result VALUES(@id,LEFT(@s,CHARINDEX(@split,@s)-1))
SET @id=@id+1
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
END
INSERT @result VALUES(@id,@s)
RETURN
END
思路:每遇到一个分隔符,则将前面的字符插入到@result table中,增加id,然后将已插入的字符和分隔符截掉,并且将剩下的字符再次进行查找分隔符,插入@result table 中,增加id, 循环操作.
只到 @s中不包含 @split 分隔符,则说明已经是最后一个字符.所以此时 直接 插入@result table 中 增加id.
结果如图:

变形 取特定位置的某个字符==============================================================================================================
Create FUNCTION [dbo].[splitSTR](
@s varchar(8000), --待分拆的字符串
@split varchar(10), --数据分隔符
@num int --目标数据
)RETURNS varchar(100)
AS
BEGIN
declare @des varchar(100)
DECLARE @splitlen int
declare @position int
set @position=1
SET @splitlen=LEN(@split+'a')-2
WHILE CHARINDEX(@split,@s)>0
if @position<>@num
BEGIN
SET @s=STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')
set @position=@position+1
END
else
begin
set @s=SUBSTRING(@s,1,CHARINDEX(@split,@s)-1)
set @des=@s
end
set @des=@s
RETURN @des
END
思路:和上面相同,在没有只到相应位置的时候,将分隔符去掉,然后循环此操作.
结果如图

sql 自定义split的更多相关文章
- SQL自定义函数split分隔字符串
SQL自定义函数split分隔字符串 一.F_Split:分割字符串拆分为数据表 Create FUNCTION [dbo].[F_Split] ( @SplitString nvarchar(max ...
- MS SQL自定义函数IsPositiveInteger MS SQL自定义函数IsNumeric 水晶报表使用IEnumerable<T>数据源
MS SQL自定义函数IsPositiveInteger 判断字符串是否为正整数,0开始的的数字不算. SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON ...
- sql自定义函数及C#中调用
1.在C#中调用sql自定义函数 1.1 标量值函数 sql语句调用 select dbo.GetClassIDWithName(1) string strSql = string.Format(& ...
- Spark SQL 自定义函数类型
Spark SQL 自定义函数类型 一.spark读取数据 二.自定义函数结构 三.附上长长的各种pom 一.spark读取数据 前段时间一直在研究GeoMesa下的Spark JTS,Spark J ...
- sql server 自定义split 标值函数
自定义一个函数,分隔一个以分隔符的隔开字符串,例如把'1,3,5,7,9' 变成 数字1 3 5 7 9的结果集. 自定义标值函数: ),)) )) --实现split功能 的函数 as begin ...
- SQL模仿Split 功能
--方法0:动态SQL法 declare @s varchar(100),@sql varchar(1000) set @s='1,2,3,4,5,6,7,8,9,10' set @sql='sele ...
- 【SQL】sql版Split函数。用于拆分字符串为单列表格
功能与.net版string.Split函数类似,只不过.net返回的是数组,这个返回的是一个单列表格,每个拆分出来的子串占一行.可选是否移除空格子串和重复项.市面上类似的函数不算少,但大多都是在循环 ...
- sql 自定义函数--固定格式字符转时间类型
遇到一个德国的客户,他们的时间格式是JJJJ-TT-DD HH:MM:SS,程序按照这个格式将时间插入数据库,但是在sql自带的转换函数convert.cast过程中报错,网上搜了下都说用conver ...
- sql 自定义排序
方法一: 比如需要对SQL表中的字段NAME进行如下的排序: 张三(Z) 李四(L) 王五(W) 赵六(Z) 按照sql中的默认排序规则,根据字母顺序(a~z)排,结果为:李四 王五 赵六 张三 ...
随机推荐
- css3 字体渐变
先看个效果 https://www.bienvillecapital.com/ 然后人家样式这样写的 font-family: Overpass,Helvetica,sans-serif; font- ...
- 海盗船长小米首页小船来回摆动CSS3.0效果
海盗船长小米首页小船来回摆动CSS3.0效果,偶然之间看到的,就写了一个. <!DOCTYPE html> <html lang="en"> <hea ...
- BZOJ4835 遗忘之树
点分树上的某个点和其某个子树在原树中的连接方式一般来说可以是由该点连向子树内任意一点,这样方案数即为所有子树大小之积.但有一种特殊情况是连接某点后导致编号最小的重心更换,只要去掉这种就行了,具体地可以 ...
- BZOJ4821 SDOI2017相关分析(线段树)
纯粹的码农题.维护x的和.y的和.xy的和.x2的和即可.可能会炸long long. #include<iostream> #include<cstdio> #include ...
- 【题解】CF#855 G-Harry Vs Voldemort
个人感觉挺有意思的,然而被颜神D无聊惹(- ̄▽ ̄)- 这题我们可以首先试图去统计以每一个点作为 w 点所能对答案造成的贡献是多少.不难发现,当且仅当 u 和 v 都在 w 所在边双的一侧的时候不能构成 ...
- 【刷题】洛谷 P4329 [COCI2006-2007#1] Bond
题意翻译 有 \(n\) 个人去执行 \(n\) 个任务,每个人执行每个任务有不同的成功率,每个人只能执行一个任务,求所有任务都执行的总的成功率. 输入第一行,一个整数 \(n\) ( \(1\leq ...
- 用Matlab对数据进行线性拟合算法
http://www.cnblogs.com/softlin/p/5965939.html 挖坑
- Android Appliction 使用解析
Application Base class for those who need to maintain global application state. You can provide your ...
- POJ3057:Evacuation——题解
http://poj.org/problem?id=3057 题目大意: .为人,D为门,X为障碍,门每秒只能出去一个人,问多少秒出光. 如果无法出光输出impossible. ——————————— ...
- BZOJ4196:[NOI2015]软件包管理器——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4196 https://www.luogu.org/problemnew/show/P2146 你决定 ...