【问题标题】:SQL Server : split value based on delimiter and match at run-timeSQL Server:基于分隔符拆分值并在运行时匹配
【发布时间】:2023-04-08 14:33:01
【问题描述】:

我有 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 行中提取 F1 分别等于 200 和 300 的行。我想我需要以某种方式拆分 ;20;30;用“;”并在运行时执行循环以分别匹配每个值,而忽略空白标记。

【问题讨论】:

  • 你能标准化你的表吗?
  • 很遗憾没有。我无法操作表格。这是给的。谢谢。
  • 这也不是 T1_TAB.F2 列中真正的分隔值,因为您有时有一个前导分隔符,有时没有。互联网上有可用的拆分功能,但如果您可以选择,我会按照 njk 的建议进行操作并规范化您的数据。在 TSQL 中使用拆分函数最终通常效果不佳,但它们对于获取您拥有的数据并将其放入规范化表结构中很有用。
  • 我建议您改为询问如何规范您的表格!
  • 我明白你的意思。但我是一个用户,他无权重组表格 - 只是提取数据进行分析。我会尝试搜索拆分器...谢谢

标签: sql-server split


【解决方案1】:

您可以创建一个函数,将分号分隔的字符串转换为值表:

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
  )

【讨论】:

  • 工作就像一个魅力......谢谢 alzaimar。
猜你喜欢
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2021-08-15
  • 2021-06-14
  • 1970-01-01
相关资源
最近更新 更多