如何在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)。
谢谢! 娃娃
答案 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