0

sqlseverでSQLによってコンテンツをキーワードで分割する方法は?

t1 と t2 の 2 つのテーブルがあり、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

上記のように t2 を更新する SQL 文を書くことはできますか? SQLserver 2008 でこのパフォーマンスが必要です。

ロジックは、t1.column1 のデータが t2.column2 の部分文字列である場合、t2.column2 を同じ t2.column1 を持つ 2 つの新しい行に分割しますが、新しい行の t2.column2 の場合、1 つは部分文字列です。 、その他は残りです (sutStr が削除されています)。

ありがとう!ワワ

4

4 に答える 4

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
于 2012-07-20T09:26:28.603 に答える
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
于 2012-07-24T10:24:54.910 に答える
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
于 2012-07-20T10:30:32.150 に答える
0


'%['+ t2.column2 +']%' のように、t1.column1 の t1 内部結合 t2 から t2.column1,t1.column1 を選択します。

于 2012-07-20T10:56:01.933 に答える