sql server中将一个字段根据某个字符拆分成多个字段显示
sql server 数据库中某张表(Person)的数据信息是:
ID |
Address |
1 | 平山花园-4单元-12幢-203 |
2 | 香山花园-3单元-22幢-304 |
现在有需求是,将地址信息显示形式改成4列 ,即小区名,单元号,楼房号,房间号 分成4列进行显示
ID | 小区名 | 单元号 | 楼房号 | 房间号 |
1 | 平山花园 | 4单元 | 12幢 | 203 |
2 | 香山花园 | 3单元 | 22幢 | 304 |
介绍两种方案:
第一种:最简单的办法就是调用sql server中自带函数PARSENAME来进行拆分,但是注意:最多只能拆分成4个字段。
针对这个例子的实现:parsename默认是根据'.'进行拆分的,所以首先要做的是将字段中的‘-’替换成'.'
SELECT Address, PARSENAME(REPLACE([Address],'-','.'),4) as 小区名, --如果字段的内容是 4单元-12幢-203 那么此时小区名字段的信息就是NULL PARSENAME(REPLACE([Address],'-','.'),3) as 单元号, PARSENAME(REPLACE([Address],'-','.'),2) as 楼房号, PARSENAME(REPLACE([Address],'-','.'),1) as 房间号 FROM Person
PARSENAME详解:
PARSENAME ( 'object_name' , object_piece )
- 'object_name'
-
要检索其指定部分的对象的名称。object_name 的数据类型为 sysname。此参数是可选的限定对象名称。如果对象名称的所有部分都是限定的,则此名称可包含四部分:服务器名称、数据库名称、所有者名称以及对象名称。
- object_piece
-
要返回的对象部分。object_piece 的数据类型为 int 值,可以为下列值:
1 = 对象名称
2 = 架构名称
3 = 数据库名称
4 = 服务器名称
PARSENAME 函数不指示指定名称的对象是否存在。PARSENAME 仅返回指定对象名称的指定部分。
第二种方案:思路:写一个函数 根据特定的分割符号利用SUBSTRING和CHARINDEX将字段进行截取拆分,
--这个函数 返回的是一个表ALTER FUNCTION [dbo].[f_splitlianxi] ( @str NVARCHAR(500),--要分割的字符串 @fengefu NVARCHAR(20)--进行分割的符号 )RETURNS @table TABLE(id INT,val NVARCHAR(50)) AS BEGIN DECLARE @index INT,@startsplit INT,@id INT --@index分隔符所在的位置的下标 @startsplit 每次分割开始的位置SELECT @index=CHARINDEX(@fengefu,@str),@startsplit=1,@id=1WHILE @index>0BEGINIF @id>1 --第一次循环之后 都执行这个方法体中的代码BEGIN SELECT @startsplit=@index+LEN(@fengefu) --分割开始位置等于 之前的字符下标位置+字符本身的长度SELECT @index=CHARINDEX(@fengefu,@str,@startsplit)END IF @index>0 --第一次循环 截取位置从@startsplit=1开始 BEGIN INSERT INTO @table VALUES (@id,SUBSTRING(@str,@startsplit,@index-@startsplit)) --要截取的字符串 开始位置 要截取的长度END ELSE BEGIN --最后一次循环 此时由于匹配不到分割字符 @index=0 截取剩余的字符串INSERT INTO @table VALUES (@id,SUBSTRING(@str,@startsplit,LEN(@str)-@startsplit+1))END SELECT @id=@id+1ENDRETURN END
调用规则:
SELECT [Address],(SELECT val FROM [f_splitlianxi]([Address],'-') WHERE id=1 ) AS 小区名 , (SELECT val FROM [f_splitlianxi]([Address],'-') WHERE id=2 )AS 单元号, (SELECT val FROM [f_splitlianxi]([Address],'-') WHERE id=3 )AS 楼房号, (SELECT val FROM [f_splitlianxi]([Address],'-') WHERE id=4 )AS 房间号 FROM Person
PS:还有一种更加粗暴的写法 就是不用另外创建函数 直接select 的时候 就通过截取字符串,来附加新的列
例如:有一个需求是 T_Person表中有字段Birth 里面的信息在输入的时候 形式不符合规定
ID Birth 1 1900/2/12 2 1898/2/3 3 4 NULL 现在要求统一形式成:1987-05-03的形式:
下面是具体过程:UPDATE dbo.T_Person SET Birth= SUBSTRING(Birth,1,CHARINDEX('/',Birth)-1) --得到年份 +'-'+ CASE WHEN SUBSTRING(Birth,CHARINDEX('/',Birth)+1,CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)-(CHARINDEX('/',Birth)+1))<10 --截取月份与10进行比较 THEN '0'+SUBSTRING(Birth,CHARINDEX('/',Birth)+1,CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)-(CHARINDEX('/',Birth)+1)) --小于10的时候 在月份前面追加个0 然后返回 ELSE SUBSTRING(Birth,CHARINDEX('/',Birth)+1,CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)-(CHARINDEX('/',Birth)+1)) --大于10的时候 截取月份返回 END --得到月份 +'-' +CASE WHEN SUBSTRING(Birth,CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)+1,LEN(Birth)-CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1))<10 --截取日与10进行比较 THEN '0'+SUBSTRING(Birth,CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)+1,LEN(Birth)-CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)) --小于10的时候 在日前面追加个0 然后返回 ELSE SUBSTRING(Birth,CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)+1,LEN(Birth)-CHARINDEX('/',Birth,CHARINDEX('/',Birth)+1)) --大于10的时候 截取日返回 END --得到日 WHERE CHARINDEX('/',Birth)>0 --防止没有/的信息字段 在进行字符串截取的时候报错 没有'/'的返回0 但是NULL 得到的值是NULL--注释 SELECT CHARINDEX('/','123') --结果是 0 SELECT CHARINDEX('/',NULL) --结果是 NULL
执行之后的结果是:
ID Birth 1 1900-02-12 2 1898-02-03 3 4 NULL
转载于:https://www.cnblogs.com/huangshuqiang/p/5477385.html
sql server中将一个字段根据某个字符拆分成多个字段显示相关推荐
- 在SQL Server中将行有效地转换为列
本文翻译自:Efficiently convert rows to columns in sql server I'm looking for an efficient way to convert ...
- sql server 中将datetime类型转换为date,或者time
sql server 中将datetime类型转换为date,或者time 2008年01月14日 星期一 14:46 这个转换总是记不住,用到的时候就找,现贴上来,以备查用. datetime类型转 ...
- SQL Server的一个不显眼的功能 备份文件的分割
SQL Server的一个不显眼的功能 备份文件的分割 当完整备份数据库的时候,我们有时候可能会遇到一种极端情况,比如服务器上C,D,E三个盘符都只剩下5G空间了 但是如果要完整备份业务库需要12G的 ...
- sql server从一个数据库复制一张表到另外一个数据库
sql server从一个数据库复制一张表到另外一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver 'ITSV ', ' ', ...
- SQL SERVER 获得一个月有多少天
SQL SERVER 获得一个月有多少天 的函数例子 -- 获得一个月有多少天 -- 经典算法 CREATE function DaysInMonth (@when datetime) retu ...
- SQL Server体系结构——一个查询的生命周期
SQL Server体系结构--一个查询的生命周期(第1部分) 为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行UPDATE操作有关的附加过程.最后你会读到,优化性能时S ...
- c 将mysql表数据打印,c 中数据库数据如何导出至excel表格-用sql语句把一个数据库内的表保存成excel表格??...
如何用JAVA将数据库中的数据导入到excel表格 1.C语言产生ASCII数据文件,使用空格做作为数据分隔符. 2入Excel,选择数据选项卡 / 获部数据工具组 / 自文本按钮 3.进入数据导入框 ...
- SQL SERVER 添加一个不可为空的字段
SQL SERVER在添加新字段的时候要求可以为空,但是如果要添加非空的新字段呢? 可以执行下面的语句: alter table [table] add NewColumn int --添加一个可以为 ...
- SQL Server中全角和半角字符的比较问题
/*------------------------------------------------------------------------------------ /*欢迎转载,请保留本声明 ...
最新文章
- 深度学习需要掌握的 13 个概率分布(附代码)
- 【数据结构与算法】3.二叉搜索树(BST)、c++代码
- html5跨域通讯之postMessage的用法
- 从体验出发构建以增长为目标的视频服务体系
- 前端打印第三方插件_vscode mock服务插件amock教程
- python 调取百度网盘API,实现上传下载
- for循环的类型以及while循环
- Android图片的三级缓存整理
- 用vue开发的h5商城小程序,thinkphp5开发拼团、砍价、秒杀、优惠券、积分、分销等功能
- Win7安装msu文件失败引发的一系列问题
- 《深度卷积神经网络原理与实践》笔记 第二、三章 卷积神经网络原理及典型结构
- 软件项目经理应具备的素质和条件_项目经理应具备的素质与能力
- K-mer特征提取one-hot编码
- 异常java.net.MalformedURLException: unknown protocol: jrt
- 玉米迷宫,Meteor Shower S,单词接龙
- 一文看尽 CVPR 2022 最新 20 篇 Oral 论文
- 并发用户数,吞吐量计算公式
- BAPI中的货物移动事务代码
- linux 连接 ftp 下载文件
- Microsoft SQL Server 2000 下载地址汇总