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中将一个字段根据某个字符拆分成多个字段显示相关推荐

  1. 在SQL Server中将行有效地转换为列

    本文翻译自:Efficiently convert rows to columns in sql server I'm looking for an efficient way to convert ...

  2. sql server 中将datetime类型转换为date,或者time

    sql server 中将datetime类型转换为date,或者time 2008年01月14日 星期一 14:46 这个转换总是记不住,用到的时候就找,现贴上来,以备查用. datetime类型转 ...

  3. SQL Server的一个不显眼的功能 备份文件的分割

    SQL Server的一个不显眼的功能 备份文件的分割 当完整备份数据库的时候,我们有时候可能会遇到一种极端情况,比如服务器上C,D,E三个盘符都只剩下5G空间了 但是如果要完整备份业务库需要12G的 ...

  4. sql server从一个数据库复制一张表到另外一个数据库

    sql server从一个数据库复制一张表到另外一个数据库 /*不同服务器数据库之间的数据操作*/ --创建链接服务器 exec sp_addlinkedserver   'ITSV ', ' ', ...

  5. SQL SERVER 获得一个月有多少天

    SQL SERVER 获得一个月有多少天 的函数例子 -- 获得一个月有多少天 -- 经典算法 CREATE  function DaysInMonth (@when  datetime)  retu ...

  6. SQL Server体系结构——一个查询的生命周期

    SQL Server体系结构--一个查询的生命周期(第1部分) 为了缩小读取操作所涉及范围,本文首先着眼于简单的SELECT查询,然后引入执行UPDATE操作有关的附加过程.最后你会读到,优化性能时S ...

  7. c 将mysql表数据打印,c 中数据库数据如何导出至excel表格-用sql语句把一个数据库内的表保存成excel表格??...

    如何用JAVA将数据库中的数据导入到excel表格 1.C语言产生ASCII数据文件,使用空格做作为数据分隔符. 2入Excel,选择数据选项卡 / 获部数据工具组 / 自文本按钮 3.进入数据导入框 ...

  8. SQL SERVER 添加一个不可为空的字段

    SQL SERVER在添加新字段的时候要求可以为空,但是如果要添加非空的新字段呢? 可以执行下面的语句: alter table [table] add NewColumn int --添加一个可以为 ...

  9. SQL Server中全角和半角字符的比较问题

    /*------------------------------------------------------------------------------------ /*欢迎转载,请保留本声明 ...

最新文章

  1. 深度学习需要掌握的 13 个概率分布(附代码)
  2. 【数据结构与算法】3.二叉搜索树(BST)、c++代码
  3. html5跨域通讯之postMessage的用法
  4. 从体验出发构建以增长为目标的视频服务体系
  5. 前端打印第三方插件_vscode mock服务插件amock教程
  6. python 调取百度网盘API,实现上传下载
  7. for循环的类型以及while循环
  8. Android图片的三级缓存整理
  9. 用vue开发的h5商城小程序,thinkphp5开发拼团、砍价、秒杀、优惠券、积分、分销等功能
  10. Win7安装msu文件失败引发的一系列问题
  11. 《深度卷积神经网络原理与实践》笔记 第二、三章 卷积神经网络原理及典型结构
  12. 软件项目经理应具备的素质和条件_项目经理应具备的素质与能力
  13. K-mer特征提取one-hot编码
  14. 异常java.net.MalformedURLException: unknown protocol: jrt
  15. 玉米迷宫,Meteor Shower S,单词接龙
  16. 一文看尽 CVPR 2022 最新 20 篇 Oral 论文
  17. 并发用户数,吞吐量计算公式
  18. BAPI中的货物移动事务代码
  19. linux 连接 ftp 下载文件
  20. Microsoft SQL Server 2000 下载地址汇总

热门文章

  1. visual studio xcopy /exclude测试
  2. 批量创建同义词并授权
  3. eclipse启动tomcat遇到404错误
  4. 跨平台 获取系统信息的python库 http://support.hyperic.com/disp
  5. imp导入时出现imp-00017 ora-06550的解决办法
  6. oracle数据库优化--基本概念
  7. EXCEL_CLASS
  8. SQL Server中利用存储过程来高性能地进行分页
  9. where to park your bike?
  10. 数字化转型的认识模型