Як обрізати рядок за допомогою SQL-сервера


105

У мене є великий рядок у SQL Server. Я хочу обрізати цей рядок до 10 або 15 символів

Оригінальний рядок

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

Бажаний рядок

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

1
ваш "бажаний рядок" містить 28 символів із "початкової рядки", не близьких до "10 або 15", про який ви просите
KM.

Відповіді:


158

Якщо ви хочете повернути лише кілька символів вашої довгої струни, ви можете використовувати:

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

Див. SQL Fiddle with Demo .

Це поверне перших 15 символів рядка, а потім об'єднає їх ...до кінця.

Якщо ви хочете переконатися, що струни менше 15 не отримують, ...тоді ви можете використовувати:

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

Див. SQL Fiddle with Demo


2
якщо початковий рядок менше 15 символів, ви все одно ...додаєте додаток, коли він не застосовується
KM.

@KM. додано версію, яка перевірятиме довжину рядка
Taryn

2
Якщо довжина col дорівнює рівно 15, вона отримає весь рядок, виконуючи ліворуч (col, 15), а потім поставить "..." в кінці. Безумовно, кращим рішенням є перевірка "коли len (col)> 15".
Мерфібро2

35

Можна використовувати

LEFT(column, length)

або

SUBSTRING(column, start index, length)

83
Це питання тепер є найпростішим способом знайти відповідь на те, як обрізати рядок у tsql. Якби ця людина цього не запитувала, я б зараз перебирав якусь статтю MSDN і ненавиджу своє життя зараз
DMac the Destroyer

4
@snaplemouton Це може бути "погано" задавати питання про прості речі (як у відповіді було легко знайти раніше), але результат все одно хороший. Я маю на увазі, ТАК призначений для отримання відповідей на всілякі запитання (навіть на запитання про інакше легко знайти речі).
jahu

8
@snaplemouton; Здогадайтесь, що під час пошуку цього питання / відповіді було у верхній частині результатів, що економило мені багато часу.
AMissico

9
Крім того, MSDN не
формулює

4
@snaplemouton, я знайшов цю відповідь у Google. Будь ласка, перестаньте розповідати людям речі Google на StackOverflow, оскільки це побачать майбутні Google. Цей сайт існує значною мірою для відображення в результатах Google.
Слотаріо

4

Я думаю, що відповіді тут чудові, але я хотів би додати сценарій.

Кілька разів мені хотілося зняти певну кількість символів з передньої частини струни, не турбуючись про її довжину. Існує кілька способів зробити це за допомогою RIGHT () та SUBSTRING (), але всі вони повинні знати довжину рядка, яка іноді може уповільнити ситуацію.

Я замість цього використовую функцію STUFF ():

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

Це замінює довжину непотрібного рядка порожнім рядком.


4

Ви також можете використовувати операцію Cast ():

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

Мені це найбільше подобається при виведенні в текстовий файл, тому що лише новій кількості символів присвоюється цей стовпець у вихідному текстовому файлі. (наприклад, 50 замість 1000) для отримання більш компактних результатів.
БіллДарсі

1

Ви також можете скористатись наведеним нижче способом. Iif уникає оператора і додає еліпси лише тоді, коли це потрібно (лише добре в SQL Server 2012 та пізніших версіях), а випадок регістру більш сумісний з ANSI (але більш докладно)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.