none
Encontrar partes de um campo varchar em em outro campo varchar no sql server 2012 RRS feed

  • 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
    quarta-feira, 24 de fevereiro de 2016 16:02

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

    quarta-feira, 24 de fevereiro de 2016 23:13

Todas as Respostas

  • O separador de valores será sempre a vírgula?



    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quarta-feira, 24 de fevereiro de 2016 18:37
  • Olá Kanaam, sim sempre a virgula
    quarta-feira, 24 de fevereiro de 2016 22:09
  • 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

    quarta-feira, 24 de fevereiro de 2016 23:13
  • Utilize a solução proposta pelo Antero que irá funcionar corretamente.

    Abraço!


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quinta-feira, 25 de fevereiro de 2016 13:28
  • Muito obrigado Antero pela ajuda.
    sexta-feira, 26 de fevereiro de 2016 00:50