Usuário com melhor resposta
Encontrar partes de um campo varchar em em outro campo varchar no sql server 2012

Pergunta
-
Boa tarde a todos,
Estou à procura de uma função no SQLServer que me retorne apenas (true ou false)
se um caractere (ou conjunto) está dentro de um campo do tipo varchar.
Algo do tipo, tenho o valor dentro de um campo em uma tabela '1,2,4,5,6,7,8', se eu procurar '1,8' me retorna true,
porque o numero '1' e o '8' estão dentro da string '1,2,4,5,6,7,8' se eu procurar '1,9' me retorna false.
neste campo eu só vou ter números separados por virgula, e o campo é do tipo varchar.
Obrigado pela ajuda- Tipo Alterado Marcos SJ quarta-feira, 24 de fevereiro de 2016 18:23 Solicitação de código / "How to"
- Tipo Alterado Roberto F FonsecaModerator segunda-feira, 29 de fevereiro de 2016 16:16 Alterado para pergunta
Respostas
-
DECLARE @string VARCHAR(100) ,@valores VARCHAR(100) SET @string = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15' SET @valores = '1,8,3,4,6,23'; WITH cte_a AS ( SELECT 0 a ,1 b UNION ALL SELECT b ,CHARINDEX(',', @string, b) + LEN(',') FROM cte_a WHERE b > a ), cte_b AS ( SELECT 0 a ,1 b UNION ALL SELECT b ,CHARINDEX(',', @valores, b) + LEN(',') FROM cte_b WHERE b > a ) SELECT COUNT(1) FROM cte_a c JOIN cte_b d ON (SUBSTRING(@string, c.a, CASE WHEN c.b > LEN(',') THEN c.b - c.a - LEN(',') ELSE LEN(@string) - c.a + 1 END)) = (SUBSTRING(@valores, d.a, CASE WHEN d.b > LEN(',') THEN d.b - d.a - LEN(',') ELSE LEN(@valores) - d.a + 1 END)) WHERE c.a > 0 AND d.a > 0 HAVING COUNT(1) = (SELECT COUNT((SUBSTRING(@valores, d.a, CASE WHEN d.b > LEN(',') THEN d.b - d.a - LEN(',') ELSE LEN(@valores) - d.a + 1 END))) FROM cte_b d WHERE d.a > 0)
Att,
Antero Marques
- Marcado como Resposta Roberto F FonsecaModerator segunda-feira, 29 de fevereiro de 2016 16:17
Todas as Respostas
-
-
-
DECLARE @string VARCHAR(100) ,@valores VARCHAR(100) SET @string = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15' SET @valores = '1,8,3,4,6,23'; WITH cte_a AS ( SELECT 0 a ,1 b UNION ALL SELECT b ,CHARINDEX(',', @string, b) + LEN(',') FROM cte_a WHERE b > a ), cte_b AS ( SELECT 0 a ,1 b UNION ALL SELECT b ,CHARINDEX(',', @valores, b) + LEN(',') FROM cte_b WHERE b > a ) SELECT COUNT(1) FROM cte_a c JOIN cte_b d ON (SUBSTRING(@string, c.a, CASE WHEN c.b > LEN(',') THEN c.b - c.a - LEN(',') ELSE LEN(@string) - c.a + 1 END)) = (SUBSTRING(@valores, d.a, CASE WHEN d.b > LEN(',') THEN d.b - d.a - LEN(',') ELSE LEN(@valores) - d.a + 1 END)) WHERE c.a > 0 AND d.a > 0 HAVING COUNT(1) = (SELECT COUNT((SUBSTRING(@valores, d.a, CASE WHEN d.b > LEN(',') THEN d.b - d.a - LEN(',') ELSE LEN(@valores) - d.a + 1 END))) FROM cte_b d WHERE d.a > 0)
Att,
Antero Marques
- Marcado como Resposta Roberto F FonsecaModerator segunda-feira, 29 de fevereiro de 2016 16:17
-
-