Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

otaviinn

Trazer o valor de uma 1º coluna se a condição de uma 2º coluna for verdadeira

Recommended Posts

Olá a todos, 

 

Estou desenvolvendo um script simples, porém me deparei com uma situação que sei que pode ser resolvida através do If, mas acredito que possa existir uma maneira mais simples (e talvez mais correta) de se fazer, é o seguinte:

 

Com um select simples preciso trazer as colunas Nome, RG,ORGAOEXP, DATAEXP, CPF, DATANASC e o telefone CELULAR do cliente, ai que está o problema, pois a estrutura da tabela encontra-se assim:

FORMACONTATO1	FORMACONTATO2	FORMACONTATO3	CONTATO1	CONTATO2	CONTATO3
-----------     -------------   --------------  ----------  ----------- ------------
Residencial	 Celular	 Comercial	1122443355	11945678910  1122433456

 

Então, eu devo trazer o CONTATO 2 que é o contato correspondente a FORMA DE CONTATO de celular, no sistema estes campos são editaveis, então isso varia de cadastro para cadastro, tem registro que o contato 1 é o celular, em outros o 3 e assim por diante.

 

Existe alguma forma de trazer somente o contato correspondente a forma de contato CELULAR sem ser pelo If?

 

Agradeço a atenção e colaboração de todos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como que se identifica um celular?
você pode fazer um case no where,,,

case then campo like '9%' then campoA else 1 end

 

uma ideia 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por sua resposta! 

 

É identificado pela coluna FORMADECONTATO, se coluna FORMADECONTATO1 estiver o registro como "CELULAR" isso significa que o número da coluna CONTATO1 é um celular.

 

O problema que estou encontrando é no select, pois não quero trazer os três telefones (CONTATO1,CONTATO2 e CONTATO3) quero trazer somente a coluna correspondente a FORMADECONTATO "celular".

 

Caso não tenha sido claro peço desculpas, novamente, obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites
23 minutos atrás, A.Jr disse:

Como que se identifica um celular?
você pode fazer um case no where,,,

case then campo like '9%' then campoA else 1 end

 

uma ideia 

 

Obrigado por sua resposta! 

 

É identificado pela coluna FORMADECONTATO, se coluna FORMADECONTATO1 estiver o registro como "CELULAR" isso significa que o número da coluna CONTATO1 é um celular.

 

O problema que estou encontrando é no select, pois não quero trazer os três telefones (CONTATO1,CONTATO2 e CONTATO3) quero trazer somente a coluna correspondente a FORMADECONTATO "celular".

 

Sou novato em banco de dados, pode me explicar um exemplo de case no where?

 

Muito obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pesquise por CASE , talvez a solução para sua query

 

 

algo como

 

(case when formacontato1='celular' then contato1 else ' ' end) c1

 

---------

 

Sua sql fica complexa pois o modelo não esta bom 

 

Se o modelo fosse

 

 

cliente

----------

cod_cliente

nome_cliente

cpf_cliente

 

contato

------------

cod_cliente

sequencial

tipo_contato

contato

 

tipo_contato

--------------------

tipo_contato

nome_contato

 

seria mais simples

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Otaviin,

 

A estrutura do banco não está da mais adequada, no entanto, conseguirá extrair o resultado dessa forma:

 

DECLARE @TABELA TABLE(
FORMACONTATO1 VARCHAR(MAX),
FORMACONTATO2 VARCHAR(MAX),
FORMACONTATO3 VARCHAR(MAX),
CONTATO1 VARCHAR(MAX),
CONTATO2 VARCHAR(MAX),
CONTATO3 VARCHAR(MAX))

 

INSERT INTO @TABELA
SELECT 'RESIDENCIAL', 'Celular', 'Comercial', '1122443355', '11945678910', '1122433456'


SELECT CASE WHEN LEN(CONTATO1) = 11 THEN CONTATO1
WHEN LEN(CONTATO2) = 11 THEN CONTATO2
WHEN LEN(CONTATO3) = 11 THEN CONTATO3 END CELULAR 
FROM @TABELA WHERE FORMACONTATO2 = 'CELULAR'

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mr22robot
      Ola caros amigos. 
      Estou com uma dúvida aqui que embora nao tenho achado ainda uma resposta, acredito que haja.
      Estou estudando a tão sonhada linguagem de programação asp.net core mvc. Linguagem essa que demorei 5 anos pra iniciar os estudos rsrs.
      Mas estou agarrado em uma situação. 
      Estou usando como base de dados nos meus estudos um banco Oracle. Que já tem algumas informações nele. Utilizei o SCAFFOLD para criar as classes e o contexto baseado no banco e tabelas existentes. 
      Porem agora na fase das consultas, estou perdido em como utilizar o IN que eu utilizo no oracle; no LINQ.
      Ex: 
      SELECT CODPROD,DESCRICAO FROM PRODUTO WHERE CODPROD IN(1,2,3,4,5,6) Como eu utilizo esse filtro com uma restrição de códigos de produtos? no caso o where codprod in(1,2,3,4,5,6) ?.
      Desde já obrigado pela ajuda.
    • Por Sapinn
      Olá a todos existe alguma maneira de trazer todos os dados de uma tabela menos o maior valor?
    • Por Wandersonwfs
      Bom dia Pessoal,
       
      Estou com um problema para finalizar uma consulta onde, quando executado a consulta  e não encontrado nenhuma informação no período solicitado, tenho que trazer pelo menos o nome da conta.
       
      Consulta,
       
      WITH TMPESTONO (
          NOME_IMPOSTO
          ,MES
          ,VALOR
          )
      AS (
          SELECT 'ESTORNO SOBRE GREEN VILLE' AS NOME_IMPOSTO
              ,'F_' + SZN.ZN_ITEM AS FILFOR
              ,SUM((SZN.ZN_PRV * SZN.ZN_PRCAPL) / 100) AS TOTAL
          FROM SZN010 SZN
          WHERE SZN.D_E_L_E_T_ = ' '
              AND SZN.ZN_ITEM IN (
                  '01'
                  ,'16'
                  ,'30'
                  ,'40'
                  ,'46'
                  ,'51'
                  ,'52'
                  ,'60'
                  ,'70'
                  ,'72'
                  ,'73'
                  ,'80'
                  )
              AND SZN.ZN_DATA BETWEEN '20220701'
                  AND '20220731'
              AND SZN.ZN_DESC = ('GRENVILLE')
          GROUP BY SZN.ZN_DESC
              ,SZN.ZN_ITEM
          )
      SELECT *
      FROM (
          SELECT NOME_IMPOSTO
              ,MES
              ,VALOR
          FROM TMPESTONO
          ) AS PivotData
      PIVOT(SUM(VALOR) FOR MES IN (
                  [F_16]
                  ,[F_30]
                  ,[F_40]
                  ,[F_46]
                  ,[F_51]
                  ,[F_52]
                  ,[F_60]
                  ,[F_70]
                  ,[F_72]
                  ,[F_73]
                  ,[TOTAL]
                  )) AS PivotTable2
      ORDER BY 1
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.