Como truncar string usando o servidor SQL

105

eu tenho uma grande string no SQL Server. Eu quero truncar essa string para 10 ou 15 caracteres

String original

this is test string. this is test string. this is test string. this is test string.

String desejada

this is test string. this is ......
SanamShaikh
fonte
1
sua "string desejada" contém 28 caracteres da "string original", não perto dos "10 ou 15" que você está pedindo
KM.

Respostas:

158

Se você deseja retornar apenas alguns caracteres de sua longa string, pode usar:

select 
  left(col, 15) + '...' col
from yourtable

Consulte SQL Fiddle with Demo .

Isso retornará os primeiros 15 caracteres da string e, em seguida, concatena o ...ao final dela.

Se você quiser ter certeza de que strings menores que 15 não recebam o ..., você pode usar:

select 
  case 
    when len(col)>=15
    then left(col, 15) + '...' 
    else col end col
from yourtable

Veja SQL Fiddle com Demo

Taryn
fonte
2
se a string original tiver menos de 15 caracteres, você ainda terá o ...anexo quando não se aplicar
KM.
@KM. adicionou uma versão que verificará o comprimento da string
Taryn
2
Se col tiver exatamente 15 de comprimento, ele obterá a string inteira ao fazer a esquerda (col, 15) e colocará '...' no final. Certamente a melhor solução é verificar 'quando len (col)> 15'.
Murphybro2
35

Você pode usar

LEFT(column, length)

ou

SUBSTRING(column, start index, length)
Snaplemouton
fonte
83
Esta pergunta SO agora é a maneira mais fácil de encontrar a resposta de como truncar uma string em tsql. Se essa pessoa não tivesse perguntado, eu estaria vasculhando algum artigo do MSDN e odiando minha vida agora ...
DMac the Destroyer
4
@snaplemouton Pode ser "ruim" fazer perguntas sobre coisas simples (já que a resposta era fácil de encontrar antes), mas o resultado é bom de qualquer maneira. Quer dizer, o SO foi feito para conter respostas a todos os tipos de perguntas (mesmo aquelas que perguntam sobre coisas fáceis de encontrar).
jahu
8
@snaplemouton; Adivinhe, ao pesquisar essa pergunta / resposta estava no topo dos resultados, o que me economiza muito tempo.
AMissico
9
Além disso, o MSDN não expressa a descrição de nenhuma das funções usando a palavra TRUNCATE
pablete
4
@snaplemouton, encontrei esta resposta no Google. Pare de dizer às pessoas para o Google coisas no StackOverflow, como os futuros Googlers verão. Este site existe em grande parte para aparecer nos resultados do Google.
Slothario
4

Acho que as respostas aqui são ótimas, mas gostaria de adicionar um cenário.

Várias vezes eu quis tirar uma certa quantidade de caracteres da frente de uma string, sem me preocupar com seu comprimento. Existem várias maneiras de fazer isso com RIGHT () e SUBSTRING (), mas todas elas precisam saber o comprimento da string, o que às vezes pode desacelerar as coisas.

Usei a função STUFF () em vez disso:

SET @Result = STUFF(@Result, 1, @LengthToRemove, '')

Isso substitui o comprimento da string desnecessária por uma string vazia.

Chloe
fonte
4

Você também pode usar a operação Cast ():

 Declare @name varchar(100);
set @name='....';
Select Cast(@name as varchar(10)) as new_name
goli55
fonte
Eu gosto mais deste ao gerar um arquivo de texto porque apenas o novo número de caracteres é alocado para essa coluna no arquivo de texto de saída. (por exemplo, 50 em vez de 1000) para resultados mais compactos.
BillDarcy de
1

Você também pode usar o seguinte, o iif evita a instrução case e só adiciona reticências quando necessário (bom apenas no SQL Server 2012 e posterior) e a instrução case é mais compatível com ANSI (mas mais detalhada)

SELECT 
  col, LEN(col), 
  col2, LEN(col2), 
  col3, LEN(col3) FROM (
  SELECT 
    col, 
    LEFT(x.col, 15) + (IIF(len(x.col) > 15, '...', '')) AS col2, 
    LEFT(x.col, 15) + (CASE WHEN len(x.col) > 15 THEN '...' ELSE '' END) AS col3 
  from (
      select 'this is a long string. One that is longer than 15 characters' as col
      UNION 
      SELECT 'short string' AS col
      UNION 
      SELECT 'string==15 char' AS col
      UNION 
      SELECT NULL AS col
      UNION 
      SELECT '' AS col
) x
) y
Gregory Blajian
fonte
0
     CASE
     WHEN col IS NULL
        THEN ''
     ELSE SUBSTRING(col,1,15)+ '...' 
     END AS Col
UpwardD
fonte