0

2 つの簡略化されたテーブルがあります (すべての列は ですvarchar)。F2の一部の行には、T1_TABで区切られた複数の値が含まれて;おり、以下に示すように区切り記号がまったくない行もあります (;最初や最後に表示される場合もあります)。F2 in はT2_TAB常に単一の値を持ちます。

1 つのテーブルからの単一選択と F2 列の可能性に基づいて、ether テーブルから行をプルできる必要があります。

T1_TAB

F0   |  F2
--------------
1          ;30
2       ;10;20;30
3          ;20;30;
4          10

T2_TAB

F1   |  F2
-------------
100       10    
200       20      
300       30

できます:

SELECT T1.F0
FROM T1_TAB T1 
LEFT JOIN T2_TAB T2
ON T2.F2 LIKE '%' + T1.F2 + '%'
WHERE T2.F1 = '200'

これはむき出しの結果になります:

2
3

今、私は反対のことをする必要があります。例えば:

条件に基づいてWHERE T1.F0 = 3、F1 がそれ​​ぞれ 200 と 300 の T2 行からプルする必要があります。どうにか分割する必要があると思います;20;30; 「;」によって 空白のトークンを無視して、実行時に各値を個別に照合するループを実行します。

4

1 に答える 1

0

セミコロンで区切られた文字列を値のテーブルに変換する関数を作成できます。

create function CreateTableFromList(@Values varchar(1000))
returns @table table (id int)
as
begin
declare @p int = 1, @q int = 1, @n int = len(@Values)

while @p<@n begin
  set @q = CHARINDEX(';',@Values,@p)
  if @q=0 set @q=@n + 1
  if @q > @p 
    insert into @table values (cast(substring(@Values,@p,@q-@p) as int))
  set @p= @q + 1
end
return
end

その後

select T2.F1 
  from T2
where T2.F2 in (
  select ID 
    from T1 
         cross apply dbo.CreateTableFromList(T1.F2) 
  where T1.F0=3
  )
于 2013-01-19T20:05:29.787 に答える