Comment tronquer une chaîne à l'aide d'un serveur SQL

105

j'ai une grande chaîne dans SQL Server. Je veux tronquer cette chaîne à 10 ou 15 caractères

Chaîne d'origine

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

Chaîne souhaitée

this is test string. this is ......
SanamShaikh
la source
1
votre "chaîne souhaitée" contient 28 caractères de la "chaîne d'origine", pas proche du "10 ou 15" que vous demandez
KM.

Réponses:

158

Si vous ne souhaitez renvoyer que quelques caractères de votre longue chaîne, vous pouvez utiliser:

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

Voir SQL Fiddle avec démo .

Cela renverra les 15 premiers caractères de la chaîne, puis concatène le ...à la fin de celle-ci.

Si vous voulez vous assurer que les chaînes inférieures à 15 n'obtiennent pas le, ...vous pouvez utiliser:

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

Voir SQL Fiddle avec démo

Taryn
la source
2
si la chaîne d'origine est inférieure à 15 caractères, vous obtenez toujours l' ...ajout lorsqu'elle ne s'applique pas
KM.
@KM. a ajouté une version qui vérifiera la longueur de la chaîne
Taryn
2
Si col a exactement 15 de longueur, il obtiendra la chaîne entière en faisant à gauche (col, 15), puis mettra '...' à la fin. Une meilleure solution est certainement de vérifier «quand len (col)> 15».
Murphybro2
35

Vous pouvez utiliser

LEFT(column, length)

ou

SUBSTRING(column, start index, length)
snaplemouton
la source
83
Cette question SO est désormais le moyen le plus simple de trouver la réponse à la manière de tronquer une chaîne dans tsql. Si cette personne ne l'avait pas demandé, alors je fouillerais dans un article de MSDN et je détesterais ma vie en ce moment ...
DMac the Destroyer
4
@snaplemouton Il peut être «mauvais» de poser des questions sur des choses simples (comme dans la réponse était facile à trouver auparavant), mais le résultat est bon quand même. Je veux dire que SO est censé contenir des réponses à toutes sortes de questions (même celles qui posent des questions autrement faciles à trouver).
jahu
8
@snaplemouton; Devinez quoi, lors de la recherche de cette question / réponse était dans le haut des résultats, ce qui m'a fait gagner beaucoup de temps.
AMissico
9
De plus, le MSDN ne formule pas la description de l'une ou l'autre des fonctions en utilisant le mot TRUNCATE
pablete
4
@snaplemouton, j'ai trouvé cette réponse sur Google. Veuillez arrêter de dire des choses à Google sur StackOverflow, car les futurs Googleurs le verront. Ce site existe en grande partie pour apparaître dans les résultats Google.
Slothario
4

Je pense que les réponses ici sont excellentes, mais j'aimerais ajouter un scénario.

Plusieurs fois, j'ai voulu supprimer un certain nombre de caractères au début d'une chaîne, sans me soucier de sa longueur. Il existe plusieurs façons de faire cela avec RIGHT () et SUBSTRING (), mais ils ont tous besoin de connaître la longueur de la chaîne, ce qui peut parfois ralentir les choses.

J'ai utilisé la fonction STUFF () à la place:

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

Cela remplace la longueur de la chaîne inutile par une chaîne vide.

Chloe
la source
4

Vous pouvez également utiliser l'opération Cast ():

 Declare @name varchar(100);
set @name='....';
Select Cast(@name as varchar(10)) as new_name
goli55
la source
J'aime mieux celui-ci lors de la sortie dans un fichier texte car seul le nouveau nombre de caractères est alloué à cette colonne dans le fichier texte de sortie. (par exemple 50 au lieu de 1000) pour des résultats plus compacts.
BillDarcy
1

Vous pouvez également utiliser ce qui suit, le iif évite l'instruction case et n'ajoute des ellipses que lorsque cela est nécessaire (uniquement bon dans SQL Server 2012 et versions ultérieures) et l'instruction case est plus conforme à ANSI (mais plus verbeuse)

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
Grégory Blajian
la source
0
     CASE
     WHEN col IS NULL
        THEN ''
     ELSE SUBSTRING(col,1,15)+ '...' 
     END AS Col
Vers le hautD
la source