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)排,结果为:李四 王五 赵六 张三 ...
随机推荐
- 钉钉 E应用 打开分享外链
钉钉 E应用 打开分享外链 外部链接 https://open-doc.dingtalk.com/microapp/dev https://open-doc.dingtalk.com/microapp ...
- 第24天:js-函数变量声明提升
一.函数声明1.自定义函数function fun1(){ alert("我是自定义函数");}fun2();//函数不调用,自己不执行2.直接量声明var fun2=functi ...
- 【Python】Python中的列表操作
Python的列表操作可谓是功能强大且方便(相对于Java)简单.常规的操作就不说了(这不是一个入门教程),介绍几个很有特点的例子 添加 # 追加到结尾(append) li = [1, 2, 3, ...
- Andorid API Package --->android.animation
包名: android.animation Added in API level 11 URL:http://developer.andr ...
- BZOJ1858:[SCOI2010]序列操作——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1858 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于 ...
- SPOJ694/DISUBSTR:Distinct Substrings——题解
https://vjudge.net/problem/SPOJ-DISUBSTR https://www.luogu.org/problemnew/show/SP694 http://www.spoj ...
- bzoj4822: [Cqoi2017]老C的任务(扫描线+BIT/线段树)
裸题... 依旧是写了BIT和线段树两种(才不是写完线段树后才想起来可以写BIT呢 怎么卡常数都挺大...QAQ ccz和yy的写法好快哇%%% BIT: #include<iostream&g ...
- Flex 布局教程:语法篇 【转】
Flex 布局教程:语法篇 作者: 阮一峰 日期: 2015年7月10日 原文:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html 网 ...
- 用户登录拦截器查询到登录用户后如何将用户信息传递到后面的Controller
taotao创建订单代码中之前忘了加入用户信息,那么加上呢? 分析:用户创建订单的时候,我们会强制要求用户先登录,也就是说,创建订单的Controller执行时,一定是用户已经登录了的,而用户只要登录 ...
- ubuntu 服务器搭建汇总
开启ssh 1.首先:终端安装开启ssh-server服务: sudo apt-get install openssh-server 2.然后确认sshserver是否启动了: ps-e | grep ...