none
Pegar somente um registro com CASE RRS feed

  • Pergunta

  • Olá Pessoal,

    Preciso de uma ajuda aqui,

    Imagine que tenho três registros na tabela Tabela_Pais com os valores de campo Language = 'ES-XX','ES-YY', 'EN-XX'.

    Para minha query abaixo gostaria que ele pegasse somente um registro e nesse caso para o teste 2 ('ES-XX').

    O problema é que ele está retornando dois registros 'ES-XX' e 'EN-XX' (teste2 e teste 3) 

    Alguém tem idéia ??


    DECLARE @idioma  CHAR(2);
    DECLARE @country CHAR(5);

    SET @country = 'ES-CO'
    SET @idioma  = 'ES'

    SELECT  
      [Language],
      SUBSTRING(Language,1,2),
      SUBSTRING( @idioma,1,2),*
    FROM Tabela_Pais
      WHERE
       codigoPeca = 9 and 
       Language =    ( CASE 
    --teste 1 - Verifica o idioma do país recebido 
    WHEN Language =  @country 
    THEN @country 
    --teste 2 - Verifica primeiro idioma disponível 
    WHEN (SUBSTRING(Language,1,2)) = (SUBSTRING( @idioma,1,2))
    THEN (SELECT TOP 1 Language 
    FROM MWIN102_PARTS_DESCRIPTION
      WHERE  SUBSTRING(Language,1,2) = @idioma ) 
    -- teste 3 - Senão pega Inglês
    ELSE 'EN-XX'
    END )


    Desde já obrigado
    quarta-feira, 8 de maio de 2019 19:28

Respostas

Todas as Respostas

  • Deleted
    quarta-feira, 8 de maio de 2019 21:13
  • Diz obrigado pelo retorno. Fiz uma simulação para ilustrar melhor, mas ainda está retornando dois registros:

    -- Cria Tabela
    DECLARE @TableLanguage table(  
        ID INT,  
        Language VARCHAR(5)); 

    -- Insert na Tabela
    INSERT @TableLanguage 
    (ID, Language)
    SELECT 1,'ES-AA'
    UNION SELECT 1,'ES-BB'
    UNION SELECT 1,'EN-CC'
    UNION SELECT 1,'EN-DD'
    UNION SELECT 1,'PT-BR'
    UNION SELECT 1,'PT-PT'
     
    -- Cria as variáveis para simular os parâmetros
    DECLARE @country CHAR(5);

    -- Alimenta variáveis
    SET @country = 'PT-BR'

    -- Query
    SELECT  
      ID,
      Language,
      SUBSTRING(Language,1,2) Language,
      SUBSTRING( @country,1,2) Idioma
    FROM @TableLanguage 
    WHERE
       ID = 1 AND
       Language =    ( CASE 
                                   --Verifica o idioma do país recebido 
           --Se houver retorne ele
            WHEN Language =  @country THEN @country 
    --Verifica primeiro idioma disponível 
    WHEN (SUBSTRING(Language,1,2)) = (SUBSTRING(@country,1,2))
    THEN (
        SELECT TOP 1 MPD.Language
    FROM @TableLanguage as MPD
                WHERE SUBSTRING(MPD.Language,1,2) =(SUBSTRING(@country,1,2))
    )
                                    -- Senão retorne um default
    ELSE 'EN-DD'
       END)

    quinta-feira, 9 de maio de 2019 00:04
  • Deleted
    quinta-feira, 9 de maio de 2019 00:43
  • Diz muito obrigado pelo retorno e atenção. Mas duas questões,

    1) o segundo código eu não consegui rodar pode ser algum detalhe que não estou conseguindo visualizar;

    2) Em termos de performance qual seria o mais indicado código 2 ou código 3?

    Obrigado.

    # código 2
    -- Cria Tabela
    DECLARE @TableLanguage table(  
        ID INT,  
        Language VARCHAR(5)); 

    -- Insert na Tabela
    INSERT @TableLanguage 
    (ID, Language)
          SELECT 1,'ES-AA'
    UNION SELECT 1,'ES-BB'
    UNION SELECT 1,'EN-CC'
    UNION SELECT 1,'EN-DD'
    UNION SELECT 1,'PT-BR'
    UNION SELECT 1,'PT-PT'
     
    -- Cria as variáveis para simular os parâmetros
    DECLARE @country CHAR(5);
    -- Alimenta variáveis
    SET @country = 'EN-DD'

    -- código #2
    WITH Filtro_Idioma (ID,Language, seq) 
    AS (
      SELECT 
    P.ID, 
    P.Language,
    (case when P.Language = @country then 1
           when SUBSTRING(P.Language,1,2) = SUBSTRING(@country,1,2) then 2
               else 3 
      end) AS Seq
      FROM @TableLanguage AS P
      WHERE P.ID = 1 
    AND (P.Language = @country
    OR SUBSTRING(P.Language,1,2) = SUBSTRING(@country,1,2)
    OR P.Language = 'EN-DD')
    )


    SELECT TOP (1) 
    @country AS Objetivo, 
    ID, 
    Language
    FROM Filtro_Idioma
    ORDER BY seq;

    quinta-feira, 9 de maio de 2019 12:33
  • Deleted
    • Marcado como Resposta Pereir0 quinta-feira, 9 de maio de 2019 16:47
    quinta-feira, 9 de maio de 2019 12:50
  • ok, obrigado.
    quinta-feira, 9 de maio de 2019 16:47