Ao trabalhar com dados no SQL Server, você pode se deparar com situações em que precisa lidar com dados separados por vírgula. Neste artigo, exploraremos diferentes técnicas para lidar com dados separados por vírgula no SQL Server.
Exibindo uma Única Coluna Delimitada por Vírgula Construída a partir de Múltiplas Colunas
Um cenário comum é quando você tem várias colunas em uma única linha e deseja exibi-las como uma única coluna, com cada valor de coluna separado por vírgula. Isso pode ser útil quando você deseja mesclar duas ou mais colunas em sua saída.
Vamos considerar um exemplo em que temos uma tabela “AddressDemo” com colunas para Nome, AddrLine1, AddrLine2, AddrLine3, Cidade, Estado e CEP. Nem todas as colunas de endereço estão preenchidas para cada registro. Nosso objetivo é exibir a coluna Nome em uma linha, seguida por todas as colunas de endereço concatenadas com vírgulas entre cada uma, e finalmente seguida pela cidade, estado e CEP na terceira linha.
Aqui está um exemplo de instrução SQL para realizar isso:
SELECT
nome + CHAR(10) +
CASE
WHEN SUBSTRING(REVERSE(COALESCE(NULLIF(AddrLine1 + ',', ','), '') + COALESCE(NULLIF(AddrLine2 + ',', ','), '') + COALESCE(AddrLine3, '')), 1, 1) = ','
THEN SUBSTRING(COALESCE(NULLIF(AddrLine1 + ',', ','), '') + COALESCE(NULLIF(AddrLine2 + ',', ','), '') + COALESCE(AddrLine3, ''), 1, LEN(COALESCE(NULLIF(AddrLine1 + ',', ','), '') + COALESCE(NULLIF(AddrLine2 + ',', ','), '') + COALESCE(AddrLine3, ''))-1)
ELSE COALESCE(NULLIF(AddrLine1 + ',', ','), '') + COALESCE(NULLIF(AddrLine2 + ',', ','), '') + COALESCE(AddrLine3, '')
END + CHAR(10) +
Cidade + ',' + Estado + ',' + CEP + CHAR(13) AS 'Rótulo de Endereço'
FROM
AddressDemo
Ao executar este código na tabela “AddressDemo”, será produzido o resultado desejado, onde cada endereço é exibido em um formato de rótulo de endereço.
Usando uma String Delimitada por Vírgula para Restringir um Critério de Seleção
Às vezes, em vez de exibir uma string delimitada por vírgula, você pode precisar usar uma string delimitada por vírgula para identificar os registros que deseja selecionar. Existem algumas opções diferentes para alcançar isso.
Uma opção é usar uma string delimitada por vírgula dentro de uma cláusula IN. Como você não pode usar diretamente uma variável contendo uma string delimitada por vírgula em uma cláusula IN, é necessário usar SQL dinâmico para construir uma declaração que contenha a cláusula IN. Aqui está um exemplo:
DECLARE @cs VARCHAR(100)
SET @cs = '1,4,6'
DECLARE @cmd NVARCHAR(100)
SET @cmd = 'SELECT * FROM test.dbo.City WHERE Id IN (' + @cs + ')'
EXEC sp_executesql @cmd
Neste exemplo, queremos selecionar registros da tabela “City” que tenham um Id de 1, 4 ou 6. Conseguimos isso especificando uma variável (@cs) que contém uma string de Ids separados por vírgulas. Em seguida, construímos uma string NVARCHAR (@cmd) para conter o comando SELECT com a variável @cs concatenada na cláusula IN. Por fim, executamos o comando SQL dinâmico usando o procedimento armazenado sp_executesql.
Outra opção é analisar a string delimitada por vírgula e usá-la para construir uma variável de tabela. Aqui está um exemplo:
DECLARE @cs VARCHAR(100)
DECLARE @i INT
DECLARE @CityIds TABLE (Id INT)
SET @cs = '1,4,6'
WHILE LEN(@cs) > 0
BEGIN
SET @i = CHARINDEX(',', @cs)
IF @i = 0
SET @i = LEN(@cs) + 1
INSERT INTO @CityIds
SELECT SUBSTRING(@cs, 1, @i-1)
SET @cs = SUBSTRING(@cs, @i+1, LEN(@cs))
END
SELECT * FROM test.dbo.City WHERE Id IN (SELECT Id FROM @CityIds)
Neste exemplo, analisamos a string delimitada por vírgula (@cs) e inserimos cada Id em uma variável de tabela (@CityIds). Em seguida, usamos a variável de tabela na cláusula IN da instrução SELECT para selecionar os registros desejados da tabela “City”.
Essas técnicas podem ser úteis ao construir procedimentos armazenados ou funções que aceitam uma string delimitada por vírgula como entrada e precisam usá-la para controlar os resultados da consulta.
Conclusão
Trabalhar com dados separados por vírgula no SQL Server pode apresentar vários desafios. Neste artigo, exploramos diferentes técnicas para lidar com dados separados por vírgula, incluindo exibir uma única coluna delimitada por vírgula construída a partir de várias colunas e usar uma string delimitada por vírgula para restringir um critério de seleção. Ao entender essas técnicas, você estará melhor preparado para lidar com dados separados por vírgula em seus projetos no SQL Server.