mssql 字符串的拼接(Join)与切分(Split)

mssql 字符串的拼接(join)与切分(split)

 

经常有高手使用select number from master..spt_values where type = 'p',这是很妙的方法;但这样只有2048个数字,而且语句太长,不够方便。

总之,一个数字辅助表(10万还是100万根据个人需要而定),你值得拥有。

2. 日历表
有用指数:★★★☆☆

《sql编程风格》一书建议一个企业的数据库教程应该创建一个日历表:
sql code
create table calendar(
    date datetime not null primary key clustered,
    weeknum int not null,
    weekday int not null,
    weekday_desc nchar(3) not null,
    is_workday bit not null,
    is_weekend bit not null
)
go
with cte1 as(
    select
        date = dateadd(day,n,'19991231')
    from nums
    where n <= datediff(day,'19991231','20201231')),
cte2 as(
    select
        date,
        weeknum = datepart(week,date),
        weekday = (datepart(weekday,date) + @@datefirst - 1) % 7,
        weekday_desc = datename(weekday,date)
    from cte1)
--insert into calendar
select
    date,
    weeknum,
    weekday,
    weekday_desc,
    is_workday = case when weekday in (0,6) then 0 else 1 end,
    is_weekend = case when weekday in (0,6) then 1 else 0 end
from cte2

这个表可以很容易根据第1条的数字辅助表生成出来。如果经常需要进行日期处理的话,或许会需要这个表。

还可以在这个表中包含一些企业关心的特殊日期,比如开盘日休市日(股票行业)、特殊纪念日和节日、重要员工的生日,等等。这些日期往往是很难计算的,比如中国的法定节假日(农历问题)。

3. 字符串的拼接(join)与切分(split)
有用指数:★★★★★

这个问题非常常见!开发中经常需要把一组值以逗号分隔拼接在一个字符串,或是反过来把一个逗号分隔的字符串切分成一组值。
用ss2005对xml的支持可以非常方便地实现这个功能。

单变量的拼接与切分:
sql code
--将一组查询结果按指定分隔符拼接到一个变量中

declare @datebases varchar(max)
set @datebases = stuff((
        select ','+name
        from sys.databases
        order by name
        for xml path('')),1,1,'')
select @datebases
--将传入的一个参数按指定分隔符切分到一个表中
declare @sourceids varchar(max)
set @sourceids = 'a,bcd,123,+-*/=,x&y,<key>'
select v = x.n.value('.','varchar(10)')
from (
    select valuesxml = cast('<root>' +
        replace((select v = @sourceids for xml path('')),',','</v><v>') +
        '</root>' as xml)
) t
cross apply t.valuesxml.nodes('/root/v') x(n)

 

批量的拼接与切分:
sql code
--测试数据:
create table #tojoin(
    tablename varchar(20) not null,
    columnname varchar(20) not null,
    primary key clustered(tablename,columnname))
go
create table #tosplit(
    tablename varchar(20) not null primary key clustered,
    columnnames varchar(max) not null)
go
insert into #tojoin values('tblemployee','employeecode')
insert into #tojoin values('tblemployee','employeename')
insert into #tojoin values('tblemployee','hiredate')
insert into #tojoin values('tblemployee','jobcode')
insert into #tojoin values('tblemployee','reporttocode')
insert into #tojoin values('tbljob','jobcode')
insert into #tojoin values('tbljob','jobtitle')
insert into #tojoin values('tbljob','joblevel')
insert into #tojoin values('tbljob','departmentcode')
insert into #tojoin values('tbldepartment','departmentcode')
insert into #tojoin values('tbldepartment','departmentname')
go
insert into #tosplit values('tbldepartment','departmentcode,departmentname')
insert into #tosplit values('tblemployee','employeecode,employeename,hiredate,jobcode,reporttocode')
insert into #tosplit values('tbljob','departmentcode,jobcode,joblevel,jobtitle')
go

--拼接(join),sql server 2005的for xml扩展可以将一个列表转成一个字串:
select
    t.tablename,
    columnnames = stuff(
        (select ',' + c.columnname
        from #tojoin c
        where c.tablename = t.tablename
        for xml path('')),
        1,1,'')
from #tojoin t
group by t.tablename

--切分(split),使用sql server 2005对xquery的支持:
select
    t.tablename,
    columnname = c.columnname.value('.','varchar(20)')
from (
    select
        tablename,
        columnnamesxml = cast('<root>' + replace((select columnname = columnnames for xml path('')),',','</columnname><columnname>') + '</root>' as xml)
    from #tosplit
) t
cross apply t.columnnamesxml.nodes('/root/columnname') c(columnname)

 

需要注意的是,倘若分隔符为";"或者字符串值中包含xml特殊字符(比如&、<、>等等),以上方法可能会无法处理。

时间: 2024-11-01 17:47:32

mssql 字符串的拼接(Join)与切分(Split)的相关文章

C#实现字符串按多个字符采用Split方法分割

原文:C#实现字符串按多个字符采用Split方法分割 String字符串如何按多个字符采用Split方法进行分割呢?本文提供VS2005和VS2003的实现方法,VS2005可以用下面的方法: string agentInfo = userInfo.Attribute19.ToString();            string[] myAgent = agentInfo.Split(new string[] { "$#$" }, StringSplitOptions.None); 

java web-JSON字符串的拼接问题。

问题描述 JSON字符串的拼接问题. 一个javaweb项目中有一个这种格式的json数据: [ { "cateName": "护肤", "id": 1, "pid": 0 }, { "cateName": "彩妆", "id": 2, "pid": 0 }, { "cateName": "洁面", &quo

大神帮帮忙-关于java中字符串的拼接问题

问题描述 关于java中字符串的拼接问题 这个程序输出的结果为什么是25255?去掉双引号后结果为55,大神们能不能解释下原因? 解决方案 带上引号,后面是字符串连接 相当于 (x + y),toString() + "" + (x+y).toString() + y.toString() 所以是"25" + "" + "25" + "5" 也就是25255 不带引号,是算术运算,最后转换为整数. 解决方案

Objective-C中字符串的拼接方法小结_IOS

在 java 和 c# 中,字符串的拼接是直接用 + 来操作的.在 OC 中,说是有下面3种方法, NSString* string; // 结果字符串 NSString* string1, string2; //已存在的字符串,需要将string1和string2连接起来  方法1: 复制代码 代码如下: string = [NSString initWithFormat:@"%@,%@", string1, string2 ];   方法2: 复制代码 代码如下: string =

Java 字符串的拼接详解_java

工作日忙于项目的逻辑实现,周六有点时间,从书柜里拿出厚厚的英文版Thinking In Java,读到了字符串对象的拼接.参考着这本书做个翻译,加上自己思考的东西,写上这篇文章记录一下. 不可变的String对象 在Java中,String对象是不可变的(Immutable).在代码中,可以创建多个某一个String对象的别名.但是这些别名都是的引用是相同的. 比如s1和s2都是"droidyue.com"对象的别名,别名保存着到真实对象的引用.所以s1 = s2 String s1

JavaScript 字符串与数组转换函数[不用split与join]_javascript技巧

两个自定义的实现字符串与数组相互转换的js函数,希望能对大家有用: 复制代码 代码如下: function StringToArray(str,substr) { /* 函数功能:字符串按照指定字符串分割转换为数组 参数: str :需转换的字符串 substr:分割字符串 返回值: 转换后的数组 */ var arrTmp = new Array(); if(substr=="") { arrTmp.push(str); return arrTmp; } var i=0, j=0,

探讨js字符串数组拼接的性能问题_javascript技巧

我们知道,在js中,字符串连接是性能最低的操作之一. 例如: 复制代码 代码如下: var text="Hello";  text+=" World!";  早期浏览器没有对这种运算进行优化. 由于字符串是不可变的,这意味着要创建中间字符串来存储连接的结果.频繁地在后台创建和销毁字符串导制性能异常低下. 因此,可以利用数组对象进行优化. 例如: var buffer=[],i=0; buffer[i++]="Hello"; //通过相应索引值添加

C#中Split分隔字符串的应用(C#、split、分隔、字符串)

1.用字符串分隔: using System.Text.RegularExpressions; string str="aaajsbbbjsccc";string[] sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);foreach (string i in sArray) Response.Write(i.ToString() + "<br>");输出结果:aaabbbccc 

SQL语句中关于字符串的拼接问题

要求:将ORACLE数据库里面的XX信息(表B,客户的数据库)导入到"接口表"(A,自己系统的数据库)中.此对照表的信息同ORACLE里面的XX数据表信息一样.此项操作由系统的系统管理员来完成,并且可以随时导入,对于已经导入成功的数据,不会重复导入.      表的结构:     CREATE TABLE A( ID NUMBER(20), UPDATED_BY NUMBER(20), UPDATE_DATE DATE, UPDATE_LOGIN NUMBER(20), CREATIO