Cómo truncar una cadena usando SQL Server

105

tengo una cadena grande en SQL Server. Quiero truncar esa cadena a 10 o 15 caracteres

Cadena original

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

Cadena deseada

this is test string. this is ......
SanamShaikh
fuente
1
su "cadena deseada" contiene 28 caracteres de la "cadena original", no cerca del "10 o 15" que está pidiendo
KM.

Respuestas:

158

Si solo desea devolver algunos caracteres de su cadena larga, puede usar:

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

Consulte SQL Fiddle con demostración .

Esto devolverá los primeros 15 caracteres de la cadena y luego concatena ...al final de la misma.

Si desea asegurarse de que las cadenas de menos de 15 no obtengan el ..., puede usar:

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

Ver SQL Fiddle con demostración

Taryn
fuente
2
si la cadena original tiene menos de 15 caracteres, aún obtiene el ...apéndice cuando no se aplica
KM.
@KM. agregó una versión que verificará la longitud de la cadena
Taryn
2
Si col tiene exactamente 15 de longitud, obtendrá la cadena completa al hacer left (col, 15) y luego pondrá '...' al final. Seguramente una mejor solución es marcar 'when len (col)> 15'.
Murphybro2
35

Puedes usar

LEFT(column, length)

o

SUBSTRING(column, start index, length)
snaplemouton
fuente
83
Esta pregunta SO es ahora la forma más fácil de encontrar la respuesta a cómo truncar una cadena en tsql. Si esta persona no lo hubiera preguntado, estaría buscando en algún artículo de MSDN y odiando mi vida en este momento ...
DMac the Destroyer
4
@snaplemouton Puede ser "malo" hacer preguntas sobre cosas simples (como en la respuesta era fácil de encontrar antes), pero el resultado es bueno de todos modos. Quiero decir, SO está destinado a contener respuestas a todo tipo de preguntas (incluso las que preguntan sobre cosas que de otro modo serían fáciles de encontrar).
jahu
8
@snaplemouton; Adivina qué, al buscar esta pregunta / respuesta estaba en la parte superior de los resultados, lo que me ahorra mucho tiempo.
AMissico
9
Además, MSDN no
expresa
4
@snaplemouton, encontré esta respuesta en Google. Deje de decirle a la gente a Google cosas en StackOverflow, como lo verán los futuros empleados de Google. Este sitio existe en gran parte para aparecer en los resultados de Google.
Slothario
4

Creo que las respuestas aquí son geniales, pero me gustaría agregar un escenario.

Varias veces he querido quitar una cierta cantidad de caracteres del frente de una cadena, sin preocuparme por su longitud. Hay varias formas de hacer esto con RIGHT () y SUBSTRING (), pero todas necesitan saber la longitud de la cadena que a veces puede ralentizar las cosas.

En su lugar, he usado la función STUFF ():

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

Esto reemplaza la longitud de la cadena innecesaria con una cadena vacía.

Chloe
fuente
4

También puede utilizar la operación Cast ():

 Declare @name varchar(100);
set @name='....';
Select Cast(@name as varchar(10)) as new_name
goli55
fuente
Me gusta más este cuando se envía a un archivo de texto porque solo el nuevo número de caracteres se asigna a esa columna en el archivo de texto de salida. (por ejemplo, 50 en lugar de 1000) para obtener resultados más compactos.
BillDarcy
1

También puede usar lo siguiente, el iif evita la declaración de caso y solo agrega puntos suspensivos cuando sea necesario (solo es bueno en SQL Server 2012 y versiones posteriores) y la declaración de caso es más compatible con ANSI (pero más detallada)

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
fuente
0
     CASE
     WHEN col IS NULL
        THEN ''
     ELSE SUBSTRING(col,1,15)+ '...' 
     END AS Col
UpwardD
fuente