Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Retorna linhas em que o ID está em uma string separada por ponto e vírgula da subconsulta MSSQL


Este é mais um exemplo da importância de normalizar seus dados.
Manter vários pontos de dados em uma única coluna quase nunca é o design correto, e por quase nunca quero dizer cerca de 99,9999%.

Se você não puder normalizar seu banco de dados, poderá usar uma solução alternativa como esta:
SELECT * 
FROM Projects p
WHERE EXISTS (
    SELECT Project_ID 
    FROM Feedback F WHERE ID = 268 
    AND Project_ID IS NOT NULL
    AND ';'+ F.Project_ID +';' LIKE '%;'+ CAST(p.Project_ID as varchar) +';%'
)

Você não pode usar o IN pois está esperando uma lista de valores delimitados por uma vírgula, enquanto você tenta fornecê-lo com um único valor delimitado por um ponto e vírgula. Mesmo que os valores em Project_ID fossem delimitados por uma vírgula, ainda assim não funcionaria.

O motivo pelo qual adicionei o ; em cada lado do Project_ID em ambas as tabelas é que desta forma o LIKE operador retornará true para qualquer local, ele encontra o Projects.Project_Id dentro do Feedback.Project_Id . Você deve adicionar o ; para o Projects.Project_Id para evitar o LIKE para retornar true quando você estiver procurando por um número que seja uma correspondência parcial com os números na string delimitada. Considere procurar 12 em uma string contendo 1;112;455 - sem adicionar o delimitador ao valor de pesquisa (12 neste exemplo) o LIKE operador retornaria true .