Как обрезать строку с помощью SQL-сервера


106

у меня большая строка в 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.

Ответы:


159

Если вы хотите вернуть только несколько символов из своей длинной строки, вы можете использовать:

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

Смотрите SQL Fiddle с демонстрацией .

Это вернет первые 15 символов строки, а затем объединит их ...до конца.

Если вы хотите убедиться, что строки меньше 15 не получают, ...вы можете использовать:

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

См. SQL Fiddle с демонстрацией


2
если исходная строка меньше 15 символов, вы все равно получите ...добавленный, когда он не применяется
KM.

@KM. добавлена ​​версия, которая будет проверять длину строки
Тарин

2
Если col имеет длину ровно 15, он получит всю строку при выполнении left (col, 15), а затем поставит '...' в конце. Конечно, лучшее решение - проверка 'when len (col)> 15'.
Murphybro2

35

Ты можешь использовать

LEFT(column, length)

или

SUBSTRING(column, start index, length)

83
Этот вопрос SO теперь является самым простым способом найти ответ на то, как обрезать строку в tsql. Если бы этот человек не спросил об этом, то я бы
рылся в

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

8
@snaplemouton; Угадайте, что при поиске этот вопрос / ответ был в верхней части результатов, что сэкономило мне много времени.
AMissico

9
Кроме того, MSDN не формулирует описание какой-либо функции с использованием слова TRUNCATE
pablete

4
@snaplemouton, я нашел этот ответ в гугле. Пожалуйста, перестаньте рассказывать людям о вещах Google в StackOverflow, так как будущие сотрудники Google это увидят. Этот сайт существует в основном для того, чтобы отображаться в результатах Google.
Slothario

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) для более компактных результатов.
BillDarcy

1

Вы также можете использовать приведенное ниже: iif избегает оператора case и добавляет многоточие только при необходимости (подходит только для SQL Server 2012 и более поздних версий), а оператор case более совместим с 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.