none
Substring no SQL RRS feed

  • Pergunta

  •  

    Olá pessoal, gostaria de saber como faço e se é possivel a abreviação de palavras no SQL Server 2005, preciso abreviar sempre que o tamanho da frase passe de 16 letras dai concateno um numero de endereço exenplo:

     

    R.Feliciano Salles Cunha 1234 ,  teria de ficar assim:

     

    R. Feliciano Salles, 1234

     

    aqui vai minha linha de código;

     

    SELECT CONVERT(VARCHAR(5),CLIENTE.IDCLIENTE) + ' / '+ CLIENTE.NOME Cliente,

    CASE WHEN CLIENTE.ENDERECO IS NOT NULL THEN(CLIENTE.ENDERECO + ' \ ' + CLIENTE.NUMERO) ELSE CLIENTE.ENDERECO END Endereco from CLIENTE

     

    Também precisava saber se tem alguma forma de quando o cliente não tiver o endereço cadastrado, não apareça somente o sinal "/ " no select pois esta aparecendo. Notem que acima tentei usando o CASE ele funciona mas não retira a barra, precisava que ele retirasse  a barra.

     

    Sem mais..

     

    Obrigado.

    segunda-feira, 19 de maio de 2008 14:07

Respostas

  • Batatinha veja a função que fiz pra vc....

     

    Esta não é a melhor solução, visto que se vc tiver uma base de dados igual minha..... se torna inviavel, na minha tabela hoje tenho mais de 18 milhões de registros.

     

    Nós aqui adotamos um campo na tabela chamado descrição abreviada, que seque algumas regras, e tem uma job que faz essas abreviações pra gente.

     

     

    Mas talvez esta função pode te ajudar.

     

    Ele não trata simplesmente o substring, pois só o substring, pode cortar sua descrição ao meio e deixar a parte que sobra sem sentido.

     

    veja ai se te ajuda.

    Abraços

     

     

    Code

    alter function fp_AbreviarDescricao(@Size Int, @Descricao varchar(8000))

    returns varchar(8000)

    as

    begin

    declare @sizeaux int, @break tinyint, @returns varchar(8000)

    set @sizeaux = @size

    set @break = 0

    if ltrim(rtrim(substring(@descricao, @size, 1))) = '' or ltrim(rtrim(substring(@descricao, @size + 1, 1))) = ''

    begin

    set @returns = substring(@descricao, 1, @size)

    end

    else

    begin

    while @break = 0

    begin

    if ltrim(rtrim(substring(@descricao, @size, 1))) = ''

    begin

    set @break = 1

    end

    set @size = @size - 1

    if @size <= 0

    begin

    set @size = @sizeaux

    break

    end

    end

    set @returns = substring(@descricao, 1, @size) + substring(@descricao, @size + 1, 2) + '.'

    end

    return @returns

    end

    go

    Ex:

     

    select dbo.fp_AbreviarDescricao(20, 'Rua: Marechal Americo Rondon Pacheco')

    esse select retornaria pra vc assim: Rua: Marechal A.

    select dbo.fp_AbreviarDescricao(21, 'Rua: Marechal Americo Rondon Pacheco')

    esse select retornaria pra vc assim: Rua: Marechal Americo

     

     

    wander Junior

    wandder_luz@hotmail.com

     

    segunda-feira, 19 de maio de 2008 17:36

Todas as Respostas

  • uma maneira

     

     

     

    SELECT replace(CONVERT(VARCHAR(5),CLIENTE.IDCLIENTE) + ' / '+ CLIENTE.NOME, '/','')  Cliente,

    CASE WHEN CLIENTE.ENDERECO IS NOT NULL THEN(CLIENTE.ENDERECO + ' \ ' + CLIENTE.NUMERO) ELSE CLIENTE.ENDERECO END Endereco from CLIENTE

     

     

    ou seja use um replace de / por '' ( vazio )

     

    abs

     

    segunda-feira, 19 de maio de 2008 14:13
  •  

    Olá,

     

    Você pode fazer usando o case mesmo...

    SELECT CONVERT(VARCHAR(5),CLIENTE.IDCLIENTE) + ' / '+ CLIENTE.NOME Cliente,

    CASE WHEN (CLIENTE.ENDERECO + ' \ ' + CLIENTE.NUMERO) = ' \ ' THEN '' ELSE (CLIENTE.ENDERECO + ' \ ' + CLIENTE.NUMERO) END Endereco from CLIENTE

     

    O  case está testando se o resultado da concatenação vai ser um " \ " (espaço+\+espaço), indicando que não tem informação no endereço e nem no número, desta forma, ele retira o " \ " do resultado. Caso contrário, ele mostra o resultado.

     

    Quanto a sua outra necessidade, de abreviar um resultado, você pode utilizar o substring mas você terá que informar o número de caracteres que você quer que apareça no seu resultset. por exemplo:

     

    Voce tem o endereço Av. Washington Luis, 623 e você quer "diminuir" a quantidade de caracteres da rua para no máximo 10 caracteres:

     

    faça:

     select substring(rua, 1, 10) + ', ' + Número from cadastro

     

    mas note, o resultado será

    Av. Washin, 623

    porque ele ira "pegar" apenas os 10 primeiros caracteres da rua.

     

    Sintaxe do SUBSTRING

    SUBSTRING(expressão, início, tamanho)

     

    Espero ter ajudado.

    segunda-feira, 19 de maio de 2008 16:26
    Moderador
  • Batatinha veja a função que fiz pra vc....

     

    Esta não é a melhor solução, visto que se vc tiver uma base de dados igual minha..... se torna inviavel, na minha tabela hoje tenho mais de 18 milhões de registros.

     

    Nós aqui adotamos um campo na tabela chamado descrição abreviada, que seque algumas regras, e tem uma job que faz essas abreviações pra gente.

     

     

    Mas talvez esta função pode te ajudar.

     

    Ele não trata simplesmente o substring, pois só o substring, pode cortar sua descrição ao meio e deixar a parte que sobra sem sentido.

     

    veja ai se te ajuda.

    Abraços

     

     

    Code

    alter function fp_AbreviarDescricao(@Size Int, @Descricao varchar(8000))

    returns varchar(8000)

    as

    begin

    declare @sizeaux int, @break tinyint, @returns varchar(8000)

    set @sizeaux = @size

    set @break = 0

    if ltrim(rtrim(substring(@descricao, @size, 1))) = '' or ltrim(rtrim(substring(@descricao, @size + 1, 1))) = ''

    begin

    set @returns = substring(@descricao, 1, @size)

    end

    else

    begin

    while @break = 0

    begin

    if ltrim(rtrim(substring(@descricao, @size, 1))) = ''

    begin

    set @break = 1

    end

    set @size = @size - 1

    if @size <= 0

    begin

    set @size = @sizeaux

    break

    end

    end

    set @returns = substring(@descricao, 1, @size) + substring(@descricao, @size + 1, 2) + '.'

    end

    return @returns

    end

    go

    Ex:

     

    select dbo.fp_AbreviarDescricao(20, 'Rua: Marechal Americo Rondon Pacheco')

    esse select retornaria pra vc assim: Rua: Marechal A.

    select dbo.fp_AbreviarDescricao(21, 'Rua: Marechal Americo Rondon Pacheco')

    esse select retornaria pra vc assim: Rua: Marechal Americo

     

     

    wander Junior

    wandder_luz@hotmail.com

     

    segunda-feira, 19 de maio de 2008 17:36
  • Olá Wander, obrigado pela atenção mas não teria uma forma mais silples de implementar este seu método tipo, que aparecesse o sobrenome da rua abreviado assim :" R. Odete A. Rocha Mendes" ou "R. Odete A. R. Mendes", seria muito legal mas de uma forma mais simples pois não posso implementar da maneira acima, mas cara sua idéia é muito legal viu.

    Outra coisa, tentei retirar a barra com as dicas que me foram dadas, mas sem sucesso. A barra aparece de qualquer forma se tem valor no campo Enderece ou não...

    Sem mais

     

    Obrigado.

     

    quarta-feira, 21 de maio de 2008 12:27
  • Ola Batatinha !!!!

     

    Veja aqui nós utilizamos uma tabela de tipo de logradouro, onde já tem um campo com a abreviação do tipo de logradouro, por tanto quando o usuario vai cadastrar o logradouro já vem pra ele pre-definido. Ex.: Rua = R:, Avenida = Av.:

     

    Essa forma eu acredito que seja a melhor forma, pois qualquer que seja a solução utilizada pra abreviar por comandos (Funções/Procedure), vai consumir processamento, e se o seu banco for igual ao meu que tem mais de 18 milhões de registros fica inviavel esse procedimento.

     

    Mas a função que fiz pra vc pode ser utilizada dentro do select mesmo. Não entendi por que vc não poderia implementa-la nos seu códigos... a não ser que o volume de dados que vc trabalhe igual ao meu (18 milhões), mas mesmo assim tenho aqui algumas consultas que utiliza uma função parecida e abre relativamente bem. claro que carrego a tabela inteira.

     

    Veja como vc poderia usar função que fiz:

    Select a.Campo001

    , dbo.fp_AbreviarDescricao(20, a.Campo002)

    from Table001 a

    where <Codições que achar necessário>

     

    Agora vou fazer pra vc uma outra função que faça a abreviação da forma que vc mencionou acima.

    Odete Almeida Rocha Mendes --> Dai ficaria assim Odete A. R. Mendes ---> é Isso que vc precisa ???

     

    se for manda um aviso que monto pra vc!!!! Valeu!

     

    Wander Junior

    wander_luz@hotmail.com

    quarta-feira, 21 de maio de 2008 21:03
  • Olá Wander, obrigado pela atenção, seria interessante esta sua função citada acima até para outros usuários do fórum futuramente, agradeço mas utilizei a sua última função descrita e esta funcionando perfeitamente então se quiser postar para que outros usuários do fórum venham a consultar seria muito interessante, mas de agora estou vendo apenas uma maneira de fazer um select apenas do nome e  o sobrenome do cliente, mas ainda estou meio em dúvidas, mas ai muito obrigado pela ajuda . estou marcando seu post como resposta OK. Até +

    Abraços. 

     

    quinta-feira, 29 de maio de 2008 10:22
  • Bom dia a todos, Wander Junior eu estou precisando de algo como você mencionou cara, tipo abreviar o segundo e o terceiro nome assim:

    Antonio Moraes Silva = Antonio M. S.

     e se tiver mais palavras ele tirar fora assim:

    Antonio Moraes Silva Santos = Antonio M. S.

     

    precisando muito cara !

    T+

     

    segunda-feira, 2 de junho de 2008 11:49