将INT列连接到以逗号分隔的INT列表

时间:2009-12-08 16:18:27

标签: sql-server

我正在运行SQL Server 2008,并试图对一些我不想通过并且尝试清理的数据存储不佳的数据运行一些查询(数百万行要处理)。我所拥有的是一个日志表,其中一些FK数据作为一个表中的逗号分隔字符串,另一个表中的整数PK。我希望能够将FK的整数列表加入到主表中的正确PK整数中。我的查询是这样的:

SELECT
    L.*
FROM MyLogs L (NOLOCK)
    INNER JOIN Details D (NOLOCK) ON L.SearchValue = D.ID

在上面的查询中,L.SearchValue包含“123,456,7890”,而D.ID是整数主键。有没有办法以任何有效的方式将它们连接在一起,或者我应该接受我的命运并开始编写脚本以将所有这些逗号分隔的值分解为单独的行?

4 个答案:

答案 0 :(得分:0)

非常非常非常糟糕的设计,这将是非常差的性能,但你可以使用CharIndex函数

   Select L.*FROM MyLogs L (NOLOCK)    
     Join Details D (NOLOCK) 
         On CharIndex(Cast(D.ID as varChar(6)), L.SearchValue) > 0

这将产生一些假连接,因为12将在'34,312,455'。要消除这些连接,您必须通过包含分隔符

使查询更加复杂
    Select L.*FROM MyLogs L (NOLOCK)    
     Join Details D (NOLOCK) 
         On CharIndex(Cast(', ' + D.ID as varChar(6)) + ',', 
                             ', ' + L.SearchValue + ',') > 0

...但我建议您开始编写脚本,将所有这些逗号分隔值分解为单独的行。

答案 1 :(得分:0)

打破这些可怕存储数据的脚本最终会比编写试图加入这些值的hacky SQL查询更有效。我不确定连接是否可行。某些形式的子查询可能会更好地作为计划A。

答案 2 :(得分:0)

您需要其中一个(修改为强制转换为整数)

T-SQL: Opposite to string concatenation - how to split string into multiple records

然后,你到了

SELECT    
L.*
FROM MyLogs L (NOLOCK),    
Details D (NOLOCK) 
Where D.ID In fn_WhatEverYouCallYourSplitFunction(L.SearchValue, ',')

不,这不高效。完全没有。

答案 3 :(得分:0)

试试这个:

SELECT L.*
FROM MyLogs L (NOLOCK)
    INNER JOIN Details D (NOLOCK) ON CONTAINS(',' + L.SearchValue + ',', ',' + Convert(varchar,D.ID) + ',')

它将是非常无效的,但不像Daniels的回答它不会打破,如果让我们说SearchValue包含(123,234,345)和D.ID是23(这对于2行是真的)

添加逗号修复了。