Jak obciąć ciąg przy użyciu serwera SQL


105

mam duży ciąg w SQL Server. Chcę skrócić ten ciąg do 10 lub 15 znaków

Oryginalny ciąg

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

Pożądany ciąg

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

1
Twój „żądany ciąg” zawiera 28 znaków z „oryginalnego ciągu”, nie zbliżone do „10 lub 15”, o które prosisz
KM.

Odpowiedzi:


158

Jeśli chcesz zwrócić tylko kilka znaków swojego długiego ciągu, możesz użyć:

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

Zobacz SQL Fiddle with Demo .

Spowoduje to zwrócenie pierwszych 15 znaków ciągu, a następnie połączenie znaku ...na końcu.

Jeśli chcesz mieć pewność, że ciągi mniejsze niż 15 nie dostaną ..., możesz użyć:

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

Zobacz SQL Fiddle with Demo


2
jeśli oryginalny ciąg ma mniej niż 15 znaków, nadal otrzymasz ...dopisek, gdy nie ma on zastosowania
KM.

@KM. dodano wersję, która będzie sprawdzać długość struny
Taryn

2
Jeśli col ma dokładnie 15 długości, otrzyma cały ciąg podczas wykonywania left (col, 15), a następnie umieści '...' na końcu. Z pewnością lepszym rozwiązaniem jest sprawdzenie „kiedy len (col)> 15”.
Murphybro2,

35

Możesz użyć

LEFT(column, length)

lub

SUBSTRING(column, start index, length)

83
To pytanie SO jest teraz najłatwiejszym sposobem znalezienia odpowiedzi na pytanie, jak obciąć ciąg w tsql. Gdyby ta osoba o to nie zapytała, przeglądałbym jakiś artykuł MSDN i nienawidziłbym teraz swojego życia ...
DMac the Destroyer

4
@snaplemouton Zadawanie pytań o proste rzeczy może być „złe” (jak wcześniej łatwo było znaleźć odpowiedź), ale i tak wynik jest dobry. Mam na myśli, że SO ma zawierać odpowiedzi na wszelkiego rodzaju pytania (nawet te, które pytają o rzeczy łatwe do znalezienia).
jahu

8
@snaplemouton; Zgadnij co, podczas wyszukiwania to pytanie / odpowiedź znalazło się na szczycie wyników, co pozwoliło mi zaoszczędzić mnóstwo czasu.
AMissico

9
Ponadto MSDN nie podaje opisu żadnej funkcji za pomocą słowa TRUNCATE
pablete

4
@snaplemouton, znalazłem tę odpowiedź w Google. Przestań mówić ludziom Google o rzeczach w StackOverflow, ponieważ przyszli Googlersi to zobaczą. Ta witryna istnieje głównie po to, aby pojawiać się w wynikach Google.
Slothario

4

Myślę, że odpowiedzi tutaj są świetne, ale chciałbym dodać scenariusz.

Kilka razy chciałem usunąć pewną liczbę znaków z przodu ciągu, nie martwiąc się o jego długość. Jest na to kilka sposobów za pomocą RIGHT () i SUBSTRING (), ale wszystkie muszą znać długość łańcucha, co czasami może spowolnić działanie.

Zamiast tego użyłem funkcji STUFF ():

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

Spowoduje to zastąpienie długości niepotrzebnego ciągu pustym ciągiem.


4

Możesz także użyć operacji Cast ():

 Declare @name varchar(100);
set @name='....';
Select Cast(@name as varchar(10)) as new_name

Najbardziej podoba mi się ten przy wyprowadzaniu do pliku tekstowego, ponieważ tylko nowa liczba znaków jest przydzielana do tej kolumny w wyjściowym pliku tekstowym. (np. 50 zamiast 1000), aby uzyskać bardziej zwięzłe wyniki.
BillDarcy

1

Możesz również użyć poniższego, iif pomija instrukcję case i dodaje wielokropki tylko wtedy, gdy jest to wymagane (dobre tylko w SQL Server 2012 i nowszych), a instrukcja case jest bardziej zgodna z ANSI (ale bardziej szczegółowa)

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.