SQL sunucusu kullanılarak dize nasıl kesilir


105

SQL Server'da büyük dizem var. Bu dizeyi 10 veya 15 karakter olacak şekilde kesmek istiyorum

Orijinal dize

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

İstenilen dize

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

1
"istediğiniz dizi", "orijinal dizeden" 28 karakter içeriyor, sorduğunuz "10 veya 15" e yakın değil
KM.

Yanıtlar:


158

Uzun dizenizin yalnızca birkaç karakterini döndürmek istiyorsanız, şunları kullanabilirsiniz:

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

Demo ile SQL Fiddle'a bakın .

Bu, dizenin ilk 15 karakterini döndürür ve ardından ...sonuna kadar birleştirir .

15'ten küçük dizelerin almadığından emin olmak istiyorsanız, ...o zaman kullanabilirsiniz:

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

Demo ile SQL Fiddle'ı görün


2
orijinal dize 15 karakterden azsa, ...geçerli olmadığında da eklenecek
KM.

@KM. dizi uzunluğunu kontrol edecek bir sürüm ekledi
Taryn

2
Sütun uzunluğu tam olarak 15 ise, sol (sütun, 15) yaparken tüm dizeyi alır ve sonra sonuna '...' koyar. Şüphesiz daha iyi bir çözüm, 'len (col)> 15' olduğunda 'kontrol etmektir.
Murphybro2

35

Kullanabilirsiniz

LEFT(column, length)

veya

SUBSTRING(column, start index, length)

83
Bu SO sorusu, tsql'de bir dizenin nasıl kesileceğinin cevabını bulmanın artık en kolay yoludur. Bu kişi sormasaydı, o zaman bir MSDN makalesini
araştırıyor ve

4
@snaplemouton Basit şeyler hakkında sorular sormak "kötü" olabilir (daha önce yanıtta olduğu gibi), ama sonuç yine de iyi. Demek istediğim, SO her türden soruya (başka türlü bulması kolay olanları soranlar bile) cevapları tutmak içindir.
jahu

8
@snaplemouton; Tahmin et ne oldu, bu soruyu / cevabı ararken sonuçların en başında yer aldı ve bu da bana çok zaman kazandırdı.
AMissico

9
Ayrıca, MSDN,
pablete

4
@snaplemouton, bu yanıtı Google'da buldum. Gelecekteki Google çalışanlarının göreceği gibi, lütfen StackOverflow'da insanlara Google'a bir şeyler anlatmayı bırakın. Bu site, büyük ölçüde Google sonuçlarında görünmek için var.
Slothario

4

Buradaki cevapların harika olduğunu düşünüyorum, ancak bir senaryo eklemek istiyorum.

Birkaç kez, uzunluğu hakkında endişelenmeden bir dizenin önünden belirli miktarda karakter almak istedim. Bunu RIGHT () ve SUBSTRING () ile yapmanın birkaç yolu vardır, ancak hepsinin dizenin uzunluğunu bilmesi gerekir, bu da bazen işleri yavaşlatabilir.

Bunun yerine STUFF () işlevini kullanıyorum:

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

Bu, gereksiz dizenin uzunluğunu boş bir dizeyle değiştirir.


4

Cast () işlemini de kullanabilirsiniz:

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

Bir metin dosyasına çıktı verirken bunu en çok seviyorum, çünkü çıktı metin dosyasındaki o sütuna yalnızca yeni sayıda karakter tahsis edilir. (örneğin 1000 yerine 50) daha kompakt sonuçlar için.
BillDarcy

1

Aşağıdakini de kullanabilirsiniz, iif case ifadesini önler ve yalnızca gerektiğinde elips ekler (yalnızca SQL Server 2012 ve sonrasında iyidir) ve case ifadesi daha ANSI uyumludur (ancak daha ayrıntılı)

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

0
     CASE
     WHEN col IS NULL
        THEN ''
     ELSE SUBSTRING(col,1,15)+ '...' 
     END AS Col
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.