我有2个简化表(所有列都是varchar
)。 F2 T1_TAB
中的某些行包含由;
分隔的多个值,有些行根本没有分隔符,如下所示(有时;
也可能出现在开头和/或结尾)。 T2_TAB
中的F2始终只有一个值。
我需要能够根据一个表中的单个选择以及F2列上的可能性从以太表中提取行。
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
,我需要分别从T2等于200和300的T2行中拉出。我想我需要以某种方式分裂; 20; 30;通过“;”并且在运行时单独匹配每个值以忽略空白标记。
答案 0 :(得分: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
)