日期:2014-05-16  浏览次数:20583 次

一个sql语句引发的问题~写sql虽易,能成功不易,大家且帮且珍惜
要从数据库中查询 格式为“XX-YYYY-ZZZ”的数据,查询结果要根据“-”分开为三部分,问题是根据xx 查询YYYY时,长度是不确定的,怎么用一个语句实现。目前已经写到
select distinct  SUBSTRING( RD_NAME , CHARINDEX('-',RD_NAME,CHARINDEX('-',RD_NAME)+1)+1 ,(DATALENGTH(RD_NAME)-CHARINDEX('-',RD_NAME,CHARINDEX('-',RD_NAME)+1))) as three  from RF_DORMS where RD_Name like 'XX%'  但是取得两个“-”之间的值长度都一样,比如为4,那么当YYYY为5位数时就少取了一位,各位大神帮帮忙……在线等
------解决方案--------------------
DECLARE @s VARCHAR(MAX)

SET @s='XX-YYYY-ZZZ'

SELECT PARSENAME(REPLACE(@s,'-','.'),3),PARSENAME(REPLACE(@s,'-','.'),2),PARSENAME(REPLACE(@s,'-','.'),1)


这样貌似也可以

但是只能支持到最多三个'-'号
------解决方案--------------------
declare @str varchar(100)
select @str='abc-123245ksd-xcnowen'

select case when @str like '%-%' then LEFT(@str,CHARINDEX('-',@str)-1) else @str end
,case when @str like '%-%-%' then 
LEFT(STUFF(@str,1,CHARINDEX('-',@str),'') ,CHARINDEX('-',STUFF(@str,1,CHARINDEX('-',@str),'') )-1)
else null end
,case when @str like '%-%-%' then 
reverse(left(REVERSE(@str),CHARINDEX('-',reverse(@str))-1))
else null end

------解决方案--------------------

DECLARE @s table(s varchar(500))
 
insert into @s values
('aa-bb-cccc-dd-eeeeee'),
('fdff-fdsfdd-zzz-dd-eeeeee-ab');

with cte as(
select ROW_NUMBER()over(order by (select 0))id,*
from @s)
,cte1 as (
select ROW_NUMBER()over(partition by id order by id) sid,id,s,number,col=SUBSTRING(a.s,number,CHARINDEX('-',a.s+'-',number)-b.number) from cte a
  join master..spt_values b on type='p' and substring('-'+s,number,1)='-')
select * into #t from cte1 
declare @s1 varchar(8000)=''
select @s1 =@s1+'(select col from #t where id=a.id and sid='+cast(sid as varchar(10))+'),' from (select distinct sid from #t)a
select @s1=LEFT(@s1,len(@s1)-1)
exec ('select distinct 
a.id,'+@s1+'
from #t a')