none
Melhorar o LIKE RRS feed

  • Pergunta

  • Prezados boa tarde!

    Na SQl abaixo eu tenho o resultado que preciso, porem eu preciso colocar um condicção no LIKE, vejam

    SQL


    SELECT  TI.IDOBJOFICINA AS 'OBJETO',
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 1  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'JAN',        
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 2  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'FEV',        
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 3  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'MAR',         
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 4  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'ABR',         
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 5  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'MAIO',         
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 6  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'JUN',        
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 7  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'JUL' ,        
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 8  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'AGOST',
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 9  THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'SETEM' ,
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 10 THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'OUT',
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 11 THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'NOV',
     COALESCE(CONVERT(VARCHAR,SUM(CASE  WHEN MONTH(T.DATAEMISSAO) = 12 THEN TI.QUANTIDADE * TI.PRECOUNITARIO END),1),'0') AS 'DEZ' ,
    TOTAL_ANO = Sum(Case When (Year(T.DATAEMISSAO) = Year(GetDate()) ) Then (TI.QUANTIDADE * TI.PRECOUNITARIO) End)     

        
     FROM TITMMOV  AS TI
    INNER JOIN TMOV AS T ON T.CODCOLIGADA = TI.CODCOLIGADA AND T.IDMOV = TI.IDMOV
    INNER JOIN TPRD AS P ON P.CODCOLIGADA = TI.CODCOLIGADA AND P.IDPRD = TI.IDPRD
    WHERE T.CODTMV IN ('1.2.01','1.2.11','1.2.12','1.2.09','1.2.18')
    AND  TI.IDOBJOFICINA IS NOT NULL
    AND YEAR(T.DATAEMISSAO) = '2012'
    AND T.CODFILIAL  = '1'
    AND P.CODIGOPRD LIKE  '05.06%'

    GROUP BY TI.IDOBJOFICINA
    ORDER BY  TI.IDOBJOFICINA

    estou usando essa condição AND P.CODIGOPRD LIKE  '05.06%' porem eu preciso que alguma coisa mais ou menos com >= and <= porem usando essa condição 05.06%

    nesse formato.

    obrigado a todos

    segunda-feira, 22 de outubro de 2012 19:39

Respostas

  • Opa, ficou melhor sim,então ja que voce tem uma padrão que seria o xx.xx e voce não quer utilizar o like, voce poderia usar o left:

    left(P.CODIGOPRD,5) = '05.06'

    Ou então um substring:

    substring(P.CODIGOPRD,1,5) = '05.06'

    Tente testar essas opções e veja se é o que voce queria...como voce não quer o like, voce precisa filtrar uma parte do texto que no caso seriam os 5 primeiros caracteres conforme acima.


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi terça-feira, 23 de outubro de 2012 12:14
    • Marcado como Resposta Ronnie Von terça-feira, 23 de outubro de 2012 17:02
    segunda-feira, 22 de outubro de 2012 19:55
  • Ronnie,

    Concordo plenamente como Alexandre, seria mais indicado e performático utilizar tanto a Função SubString ou Left para trabalhar com esta parte de seu campo, ainda mais por você ter uma padrão e tamanho específico.

    Quando utilizamos o Like, o SQL Server entende que temos que selecionar partes dos dados que estão sendo armazenados em suas colunas caracteres de acordo com o caracter coringa, o processo de pesquisa e identificação do Like é bastante questionável e em algumas situações acaba se tornando o gargalo no processamento da Query.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Ronnie Von terça-feira, 23 de outubro de 2012 17:02
    terça-feira, 23 de outubro de 2012 12:14

Todas as Respostas

  • Boa tarde Ronnie Von, voce pode passar alguns exemplos dos dados que tem na coluna CODIGOPRD  ? se os 5 primeiros caracteres da coluna foram o 05.06 voce poderia utilizar left(P.CODIGOPRD,5) = '05.06'.

    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    segunda-feira, 22 de outubro de 2012 19:46
  • Desculpas Alexandre segue as informaçoes;

    nessa tabela codigoprd temos;

    01.04

    01.04.00001

    01.04.00002

    01.05

    01.05.00001

    01.05.00002

    01.06

    01.06.00001

    01.06.00002

    02.01

    02.01.00001

    02.01.00002

    02.02

    02.02.00001

    02.02.00002

    tipo eu preciso buscar por esses grupos primeiro nivel

    xx.xx

    ficou melhor assim?

    segunda-feira, 22 de outubro de 2012 19:52
  • Opa, ficou melhor sim,então ja que voce tem uma padrão que seria o xx.xx e voce não quer utilizar o like, voce poderia usar o left:

    left(P.CODIGOPRD,5) = '05.06'

    Ou então um substring:

    substring(P.CODIGOPRD,1,5) = '05.06'

    Tente testar essas opções e veja se é o que voce queria...como voce não quer o like, voce precisa filtrar uma parte do texto que no caso seriam os 5 primeiros caracteres conforme acima.


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi terça-feira, 23 de outubro de 2012 12:14
    • Marcado como Resposta Ronnie Von terça-feira, 23 de outubro de 2012 17:02
    segunda-feira, 22 de outubro de 2012 19:55
  • Ronnie,

    Concordo plenamente como Alexandre, seria mais indicado e performático utilizar tanto a Função SubString ou Left para trabalhar com esta parte de seu campo, ainda mais por você ter uma padrão e tamanho específico.

    Quando utilizamos o Like, o SQL Server entende que temos que selecionar partes dos dados que estão sendo armazenados em suas colunas caracteres de acordo com o caracter coringa, o processo de pesquisa e identificação do Like é bastante questionável e em algumas situações acaba se tornando o gargalo no processamento da Query.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Ronnie Von terça-feira, 23 de outubro de 2012 17:02
    terça-feira, 23 de outubro de 2012 12:14
  • Prezados Obrigado pelas informaçoes e esclarecimentos.
    terça-feira, 23 de outubro de 2012 17:03