代码之家  ›  专栏  ›  技术社区  ›  Matthew Groves

如何加入CSV varchar?

  •  1
  • Matthew Groves  · 技术社区  · 16 年前

    select *
    from SomeTable a
    WHERE (',' + @csvString + ',') LIKE '%,' + CONVERT(varchar(25), a.ID) + ',%'
    

    其中@csvString是“10,11,12,…”。我还打算将此方法用作连接条件。

    这种方法可行,但速度相当慢(使用CAST并不能提高速度)。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Daniel Renshaw    16 年前

    你需要一个分裂函数。网上有很多这样的例子。这里只有一个: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

        2
  •  1
  •   David Good    16 年前

    可能有一种更有效的方法来使用CTE或表变量。。。

    CREATE FUNCTION dbo.[SplitIds]
    (
      @identities varchar(2000)
    )
    RETURNS 
    @IdList table
    (
      ID int
    )
    AS
    BEGIN
      DECLARE @ID varchar(10), @idx int
    
      SELECT @identities = LTRIM(RTRIM(@identities))+ ','
      SELECT @idx = CHARINDEX(',', @identities, 1)
    
      IF REPLACE(@identities, ',', '') <> ''
      BEGIN
        WHILE @idx > 0
        BEGIN
          SELECT @ID = LTRIM(RTRIM(LEFT(@identities, @idx - 1)))
          IF @ID <> ''
          BEGIN
            INSERT INTO @IdList (ID) 
            VALUES (CAST(@ID AS int))
          END
          SET @identities = RIGHT(@identities, LEN(@identities) - @idx)
          SET @idx = CHARINDEX(',', @identities, 1)
        END
      END  
      RETURN
    END
    GO
    
    DECLARE @string varchar(2000)
    
    SELECT @string = identities FROM MyTable WHERE Id = 1
    
    SELECT * 
    FROM dbo.People 
    WHERE Id IN 
    (
     SELECT ID FROM dbo.SplitIds(@string)
    )