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)排,结果为:李四 王五 赵六 张三 ...
随机推荐
- [socket编程] 一个服务器与多个客户端之间通信
转自:http://blog.csdn.net/neicole/article/details/7539444 并加以改进 Server程序: // OneServerMain.cpp #includ ...
- 第61天:json遍历和封装运动框架(多个属性)
一.json 遍历 for in 关键字 for ( 变量 in 对象) { 执行语句; } 例如: var json = {width:200,height:300,left:50}co ...
- Codeforces Round#516 Div.1 翻车记
A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...
- [luogu5048] [Ynoi2019模拟赛] Yuno loves sqrt technology III
题目链接 洛谷. Solution 思路同[BZOJ2724] [Violet 6]蒲公英,只不过由于lxl过于毒瘤,我们有一些更巧妙的操作. 首先还是预处理\(f[l][r]\)表示\(l\sim ...
- Android关于注解那点事(二)
前言 上篇主要讲解了注解的基本操作,以及一个运行时注解的小例子,今天我们主要来说道说道注解中另一种实现方式,编译时注解(CLASS),不同于上篇例子的运行时注解(RUNTIME),需要在代码运行时,反 ...
- PE格式示意图
- Qt ---------- connect连接类型
Qt::AutoConnection 0 (Default) If the receiver lives in the thread that emits the signal, Qt::Direct ...
- oracle重新编译失效对像
重新编译失效对像可执行utlrp.sql文件: SQL> @?/rdbms/admin/utlrp.sql TIMESTAMP --------------------------------- ...
- JS判断内容为空方法总结
HTML代码: 用户名:<input type="text" id="username"> <p style="color:red& ...
- Java 中 给静态方法 添加泛型 (static <T>)
今天在用到static方法的时候.想要用泛型.结果不能通过编译. 上网查了一下.其具体写法如下: