如何在SQL Server中用SQL分割内容?

时间:2012-07-20 09:19:07

标签: sql sql-server sql-server-2008 split

如何在sqlsever中通过SQL用某个关键字拆分内容?

我有两个表,t1和t2,我想在t2中用t1中的单词拆分一些列。

t1
column1
a
bc
c
z

t2(based)
column1 column2
1        abcrrr    
2        cdt
3        e


t2(updated)
column1 column2
1        a
1        bc
1        rrr
2        c
2        dt
3        e

是否有可能像上面那样编写一个SQL语句来更新t2?我希望在SQLserver 2008中有这种性能。

逻辑是,如果t1.column1中的数据是某些t2.column2的subString,则将t2.column2拆分为两个具有相同t2.column1的新行,但是对于新行的t2.column2,是subString,其他是其他(删除了sutStr)。

谢谢! 娃娃

4 个答案:

答案 0 :(得分:1)

declare @t table(column1 int, column2 varchar(100))
insert into @t 
select 1,        'ab' union all     
select 2,        'cd' union all 
select 3,        'e' 

 select t1.column1,char(t2.number) as columns2 from @t as t1 
 inner join master..spt_values as t2 on t1.column2 like '%'+char(t2.number)+'%'
 where type='p' and number between 97 and  97+25

答案 1 :(得分:0)

您可以尝试使用任何字符集。

declare @t table(column1 int, column2 varchar(100))
insert into @t 
select 1,        'abc' union all     
select 2,        'cd' union all 
select 3,        'eyiuyiu' 
select * from @t
;WITH CTE as (
select column1,CASE when len(column2) >= 0 then left(column2,1) else column2 end as column2,RIGHT(column2,len(column2)-1) as rem from @t --where column1 = 1
union all
select t1.column1,CASE when len(rem) >= 0 then left(rem,1) else rem end as column2,RIGHT(rem,len(rem)-1) as rem from CTE c inner join @t t1
on c.column1=t1.column1 and CHARINDEX(c.rem,t1.column2,1) > 0
 )
select column1,column2 from cte order by 1

答案 2 :(得分:0)

从t1选择t2.column1,t1.column1  t1.column1上的内连接t2,如'%['+ t2.column2 +']%'

答案 3 :(得分:0)

首先创建函数

CREATE FUNCTION FN_COL_SPLIT(@COL VARCHAR(200))
RETURNS @TPARTS TABLE ( PART VARCHAR(20) )
AS
BEGIN

;WITH CTE ( RNK ,AUTOID,COLUMN1,COL,SLNO)AS (
SELECT  ROW_NUMBER() OVER(ORDER BY T1.AUTOID) AS RNK,T1.AUTOID,T1.COLUMN1,REPLACE(@COL,T1.COLUMN1,'') AS COL,0 FROM T1  
WHERE (LEN(REPLACE(@COL,T1.COLUMN1,''))<>LEN(@COL))   
UNION ALL
SELECT   ROW_NUMBER() OVER(ORDER BY T1.AUTOID) AS RNK,T1.AUTOID,T1.COLUMN1 ,REPLACE(COL,T1.COLUMN1,'') AS COL,SLNO+1 FROM CTE C   JOIN T1 
ON LEN(REPLACE(COL,T1.COLUMN1,''))<>LEN(COL)      )
INSERT INTO @TPARTS
SELECT DISTINCT COLUMN1 FROM CTE  WHERE RNK=1
UNION 
SELECT COL FROM CTE WHERE LEN(COL)=(SELECT MIN(LEN(COL)) FROM CTE)

IF (SELECT COUNT(*) FROM  @TPARTS)=0 INSERT INTO @TPARTS SELECT @COL

RETURN
END

然后使用下面的select语句来获得结果

SELECT T2.COLUMN1,T3.PART FROM T2 CROSS APPLY FN_COL_SPLIT(T2.COLUMN2) T3