Как я могу присоединиться к CSV varchar? - PullRequest
1 голос
/ 12 мая 2010

У меня есть поле varchar, которое содержит строку типа "10,11,12,13". Как я могу использовать эту строку CSV, чтобы присоединиться к другой таблице с этими идентификаторами? Вот подход, который я сейчас использую:

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

Где @csvString равно "10,11,12, ...". Я намерен также использовать этот метод в качестве условия соединения.

Этот метод работает, но он довольно медленный (использование CAST не улучшает скорость).

Я понимаю, что наличие CSV в базе данных, как это обычно бывает очень глупой идеей, но я ничего не могу с этим поделать.

Ответы [ 2 ]

2 голосов
/ 12 мая 2010

Вам нужна функция разделения. Есть много примеров таких вещей в Интернете. Вот только один: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

1 голос
/ 12 мая 2010

Может быть более эффективный способ сделать это с помощью переменной 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...